दिलचस्प पोस्ट
फ़ाइल बनाने और सहेजने के लिए HTML5 / Javascript का उपयोग करना आईओएस के लिए इवेंट हैंडलिंग – कैसे hitTest: साथएवेंट: और प्वाइंटइनसाइड: साथएवेंट: संबंधित हैं? jquery scroll, नेविगेशन सक्रिय वर्ग को बदलने के रूप में पृष्ठ स्क्रॉल कर रहा है, वर्गों के सापेक्ष ConfigParser में सूचियां चयनित चेकबॉक्स की संख्या को कैसे सीमित करें? ओराकल एसक्यूएल में स्कीमा में मैं सभी तालिकाओं की सूची कैसे करूं? वर्तमान संदर्भ में नाम 'कॉन्फ़िगरेशन प्रबंधक' मौजूद नहीं है अजगर में जटिल संख्या का उपयोग एक पहचान मूल्य लौटते समय ExecuteScalar बनाम ExecuteNonQuery शीर्ष पर पंक्तियाँ डालते समय यूटिविज़िव स्थिर रखें किसी एप्लिकेशन को लॉन्च करें और उसे दूसरे मॉनीटर पर भेजें? MongoDB जावा ड्राइवर के लिए लॉगिंग कॉन्फ़िगर करें कैसे एमपी 3 में अवधि को पुनः प्राप्त करें। NET? IOS 6 में UIActivityViewController के लिए प्राप्तकर्ता कैसे सेट करूं? बल जावास्क्रिप्ट का उपयोग कर एक छवि डाउनलोड करें

उन दस्तावेज़ों की क्वेरी जहां सरणी का आकार 1 से अधिक है

मेरे पास निम्नलिखित प्रारूप में दस्तावेज़ों के साथ एक MongoDB संग्रह है:

{ "_id" : ObjectId("4e8ae86d08101908e1000001"), "name" : ["Name"], "zipcode" : ["2223"] } { "_id" : ObjectId("4e8ae86d08101908e1000002"), "name" : ["Another ", "Name"], "zipcode" : ["2224"] } 

मैं वर्तमान में ऐसे दस्तावेज़ प्राप्त कर सकता हूं जो विशिष्ट सरणी आकार से मेल खाते हैं:

 db.accommodations.find({ name : { $size : 2 }}) 

यह सही ढंग से name सरणी में 2 तत्वों के साथ दस्तावेज़ देता है। हालांकि, मैं सभी दस्तावेज़ों को वापस करने के लिए $gt कमांड नहीं कर सकता जहां name क्षेत्र में 2 से अधिक के एक सरणी का आकार होता है:

 db.accommodations.find({ name : { $size: { $gt : 1 } }}) 

मैं सभी दस्तावेज़ों को एक से अधिक आकार के एक name सरणी के साथ कैसे चुन सकता / सकती हूं (वर्तमान डेटा संरचना को संशोधित किए बिना)?

Solutions Collecting From Web of "उन दस्तावेज़ों की क्वेरी जहां सरणी का आकार 1 से अधिक है"

अद्यतन करें:

मोंगोडब के संस्करण 2.2+ के लिए और अधिक जवाब में @ जॉनी एचके द्वारा वर्णित ऐसा करने के लिए अधिक कुशल तरीका।


1. $ का उपयोग कर रहा है

 db.accommodations.find( { $where: "this.name.length > 1" } ); 

परंतु…

जावास्क्रिप्ट इस पृष्ठ पर सूचीबद्ध देशी ऑपरेटरों की तुलना में धीरे-धीरे कार्यान्वित करता है, लेकिन बहुत लचीला है अधिक जानकारी के लिए सर्वर साइड प्रसंस्करण पृष्ठ देखें।

2. अतिरिक्त फ़ील्ड NamesArrayLength , इसे नाम सरणी लंबाई के साथ अपडेट करें और फिर क्वेरीज़ में उपयोग करें:

 db.accommodations.find({"NamesArrayLength": {$gt: 1} }); 

यह बेहतर समाधान होगा, और बहुत तेजी से काम करेगा (आप उस पर इंडेक्स बना सकते हैं)।

ऐसा करने के लिए एक अधिक कुशल तरीका है MongoDB 2.2+ में अब आप क्वेरी ऑब्जेक्ट कुंजी में संख्यात्मक सरणी अनुक्रमणिका का उपयोग कर सकते हैं।

 // Find all docs that have at least a second name array element. db.accommodations.find({'name.1': {$exists: true}}) 

मेरा मानना ​​है कि यह आपके प्रश्न का उत्तर देने वाली सबसे तेज़ी से पूछताछ है, क्योंकि यह किसी व्याख्याकृत $where उपयोग नहीं करता है $where खंड:

 {$nor: [ {name: {$exists: false}}, {name: {$size: 0}}, {name: {$size: 1}} ]} 

इसका अर्थ है "बिना किसी नाम (या तो गैर विद्यमान या खाली सरणी) या सिर्फ एक नाम के साथ-साथ सभी दस्तावेज़।"

परीक्षा:

 > db.test.save({}) > db.test.save({name: []}) > db.test.save({name: ['George']}) > db.test.save({name: ['George', 'Raymond']}) > db.test.save({name: ['George', 'Raymond', 'Richard']}) > db.test.save({name: ['George', 'Raymond', 'Richard', 'Martin']}) > db.test.find({$nor: [{name: {$exists: false}}, {name: {$size: 0}}, {name: {$size: 1}}]}) { "_id" : ObjectId("511907e3fb13145a3d2e225b"), "name" : [ "George", "Raymond" ] } { "_id" : ObjectId("511907e3fb13145a3d2e225c"), "name" : [ "George", "Raymond", "Richard" ] } { "_id" : ObjectId("511907e3fb13145a3d2e225d"), "name" : [ "George", "Raymond", "Richard", "Martin" ] } > 

आप समेकित भी उपयोग कर सकते हैं:

 db.accommodations.aggregate( [ {$project: {_id:1, name:1, zipcode:1, size_of_name: {$size: "$name"} } }, {$match: {"size_of_name": {$gt: 1}}} ]) 

// आप दस्तावेज़ को पारगमन करने के लिए "आकार_ऑफ़_नाम" जोड़ते हैं और नाम का आकार फ़िल्टर करने के लिए इसका उपयोग करते हैं

उपरोक्त में से कोई भी मेरे लिए काम नहीं करता है यह एक ऐसा था इसलिए मैं इसे साझा कर रहा हूं:

 db.collection.find( {arrayName : {$exists:true}, $where:'this.arrayName.length>1'} ) 

आप आसानी से पा सकते हैं कि दूसरा तत्व मौजूद है या नहीं।

 db.accommodations.find({'name.1': {$exists: true}}); 

ऐसा कुछ करने की कोशिश करें:

 db.getCollection('collectionName').find({'ArrayName.1': {$exists: true}}) 

1 संख्या है, यदि आप 50 से अधिक रिकॉर्ड प्राप्त करना चाहते हैं तो ऐरेनाम करो .5 धन्यवाद।

 db.accommodations.find({"name":{"$exists":true, "$ne":[], "$not":{"$size":1}}}) 

मुझे यह समाधान मिला, एक निश्चित फ़ील्ड के साथ वस्तुओं को खोजने के लिए, कुछ लंबाई से अधिक

 db.allusers.aggregate([ {$match:{username:{$exists:true}}}, {$project: { count: { $size:"$locations.lat" }}}, {$match:{count:{$gt:20}}} ]) 

पहले $ मैच कुल एक तर्क का उपयोग करता है जो सभी दस्तावेजों के लिए सही है। अगर रिक्त है, तो मुझे मिल जाएगा

 "errmsg" : "exception: The argument to $size must be an Array, but was of type: EOO" 

यद्यपि उपर्युक्त उत्तर सभी काम करते हैं, जो आपने मूल रूप से करने का प्रयास किया था, वह सही तरीका था, हालांकि आपके पास सिर्फ सिंटेक्स पीछे है (स्विच "$ आकार" और "$ gt") ..

सही बात:

 db.collection.find({items: {$gt: {$size: 1}}}) 

गलत:

 db.collection.find({items: {$size: {$gt: 1}}})