दिलचस्प पोस्ट
कैनवास और सतह अवधारणाओं को समझना "BEGIN आरएसए निजी कुंजी" और "BEGIN निजी कुंजी" के बीच अंतर क्या है आईट्यून्स कनेक्ट एपीआई SQL रिक्त है और = नल आप एक अंतरफलक के सभी कार्यान्वयन कैसे प्राप्त करते हैं? सी ++ ब्लॉक – मूल्य या संदर्भ से अपवाद पकड़ो? जावास्क्रिप्ट में क्लोजर सी ++ – <अनसुलझे अतिभारित फ़ंक्शन प्रकार> ब्लैकबेरी – कैसे छवि का आकार बदलना है? क्या मैं अपना स्पष्ट प्रकार तुलनित्र इनलाइन निर्दिष्ट कर सकता हूं? जीआईटी रिपॉजिटरी से एक निर्देशिका को कैसे निकालना है? दिनांक ऑब्जेक्ट को अंकीय वस्तुओं में बदलने से ifelse () को रोकने के लिए पाठ फ़ाइलों को एक नई पंक्ति के साथ समाप्त क्यों करना चाहिए? कोणीय जे एस – प्लेसहोल्डर फ़िल्टर से खाली परिणाम के लिए क्या "इंस्टॉन्सफ़" ऑपरेटर का उपयोग खराब डिज़ाइन माना जाता है?

उन दस्तावेज़ों की क्वेरी जहां सरणी का आकार 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 सरणी के साथ कैसे चुन सकता / सकती हूं (वर्तमान डेटा संरचना को संशोधित किए बिना)?

वेब के समाधान से एकत्रित समाधान "उन दस्तावेज़ों की क्वेरी जहां सरणी का आकार 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}}})