$where
का इस्तेमाल करना
ऑपरेटर।
db.collection.find(function() {
return this.docs.length === this.docs.filter(function(doc) {
return typeof(doc.foo) !== "undefined" && doc.foo !== null ;}).length
})
ऐसा करने का दूसरा तरीका दो प्रश्नों को चलाना है:एक _id
. को पुनः प्राप्त करने के लिए उन सभी दस्तावेज़ों में से जो विशिष्ट ()
विधि:
var unwantedIds = db.collection.distinct( "_id", { "docs": { "$elemMatch": { "foo": { "$exists": false } } } } );
फिर $nin
. का उपयोग करें ऑपरेटर उन सभी दस्तावेजों को वापस करने के लिए जो आपके मानदंडों से मेल खाते हैं।
db.collection.find({ "_id": { "$nin": unwantedIds } } )
आप <का भी इस्तेमाल कर सकते हैं कोड>.एग्रीगेट ()
विधि लेकिन यह केवल तभी काम करती है जब आप संस्करण 3.2 या नए पर हों क्योंकि आपको $फ़िल्टर
पाइपलाइन में पहला चरण $match
है
चरण जहाँ आप उन दस्तावेज़ों को फ़िल्टर करते हैं जहाँ "foo" फ़ील्ड अनुपस्थित है। यह उन दस्तावेजों की कुल संख्या को कम करता है जिन्हें पाइप के नीचे संसाधित किया जाएगा। अगला और आखिरी चरण है $redact
मंच। इस चरण में आपको $size
. का उपयोग करने की आवश्यकता है ऑपरेटर "दस्तावेज़" फ़ील्ड के आकार और उप-दस्तावेज़ों की सरणी के आकार को वापस करने के लिए जहां "foo" मौजूद है और उन सभी दस्तावेज़ों को वापस कर दें जहां दो मान बराबर हैं।
db.collection.aggregate([
{ "$match": { "docs.foo": { "$exists": true } } },
{ "$redact": {
"$cond": [
{ "$eq": [
{ "$size": "$docs" },
{ "$size": {
"$filter": {
"input": "$docs",
"as": "doc",
"cond": {
"$ne": [
{ "$ifNull": [ "$$doc.foo", null ] },
null
]
}
}
}}
]},
"$$KEEP",
"$$PRUNE"
]
}}
])