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"
]
}}
])