Brug af $where
operatør.
db.collection.find(function() {
return this.docs.length === this.docs.filter(function(doc) {
return typeof(doc.foo) !== "undefined" && doc.foo !== null ;}).length
})
En anden måde at gøre dette på er at køre to forespørgsler:En for at hente _id
af alle de dokumenter, der ikke matcher dine kriterier ved hjælp af distinct()
metode:
var unwantedIds = db.collection.distinct( "_id", { "docs": { "$elemMatch": { "foo": { "$exists": false } } } } );
Brug derefter $nin
operatør for at returnere alle de dokumenter, der matcher dine kriterier.
db.collection.find({ "_id": { "$nin": unwantedIds } } )
Du kan også bruge .aggregate()
metode, men dette virker kun, hvis du er på version 3.2 eller nyere, fordi du skal bruge $filter
Første fase i pipelinen er $match
trin, hvor du frafiltrerer de dokumenter, hvor "foo"-feltet er fraværende. Dette reducerer det samlede antal dokumenter, der vil blive behandlet. Næste og sidste trin er $redact
scene. I dette trin skal du bruge $size
operatør for at returnere størrelsen af feltet "dokumenter" og størrelsen af rækken af underdokumenter, hvor "foo" er til stede og returnere alle de dokumenter, hvor de to værdier er ens.
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"
]
}}
])