Verwenden von $where
Betreiber.
db.collection.find(function() {
return this.docs.length === this.docs.filter(function(doc) {
return typeof(doc.foo) !== "undefined" && doc.foo !== null ;}).length
})
Eine andere Möglichkeit besteht darin, zwei Abfragen auszuführen:Eine zum Abrufen der _id aller Dokumente, die Ihren Kriterien nicht entsprechen, mit dem distinct()
Methode:
var unwantedIds = db.collection.distinct( "_id", { "docs": { "$elemMatch": { "foo": { "$exists": false } } } } );
Verwenden Sie dann den $nin Operator, um alle Dokumente zurückzugeben, die Ihren Kriterien entsprechen.
db.collection.find({ "_id": { "$nin": unwantedIds } } )
Sie können auch den $filter
Die erste Stufe in der Pipeline ist der $match
Phase, in der Sie die Dokumente herausfiltern, in denen das Feld "foo" fehlt. Dadurch wird die Gesamtzahl der Dokumente reduziert, die im weiteren Verlauf verarbeitet werden. Die nächste und letzte Stufe ist der $redact
Bühne. In dieser Phase müssen Sie den $size verwenden -Operator, um die Größe des Felds „docs“ und die Größe des Arrays der untergeordneten Dokumente zurückzugeben, in denen „foo“ vorhanden ist, und alle Dokumente zurückzugeben, bei denen die beiden Werte gleich sind.
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"
]
}}
])