De $where
gebruiken
telefoniste.
db.collection.find(function() {
return this.docs.length === this.docs.filter(function(doc) {
return typeof(doc.foo) !== "undefined" && doc.foo !== null ;}).length
})
Een andere manier om dit te doen is door twee zoekopdrachten uit te voeren:Een om de _id
. op te halen van al die documenten die niet voldoen aan uw criteria met behulp van de distinct()
methode:
var unwantedIds = db.collection.distinct( "_id", { "docs": { "$elemMatch": { "foo": { "$exists": false } } } } );
Gebruik dan de $nin
operator om al die documenten terug te sturen die aan uw criteria voldoen.
db.collection.find({ "_id": { "$nin": unwantedIds } } )
U kunt ook de $filter
De eerste fase in de pijplijn is de $match
fase waarin u die documenten uitfiltert waar het veld "foo" ontbreekt. Dit vermindert het totale aantal documenten dat door de pijp zal worden verwerkt. De volgende en laatste fase is de $redact
fase. In deze fase moet je de $size
. gebruiken operator om de grootte van het veld "docs" en de grootte van de array van de subdocumenten waarin "foo" aanwezig is te retourneren en al die documenten terug te geven waarvan de twee waarden gelijk zijn.
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"
]
}}
])