Pomocí $where
operátor.
db.collection.find(function() {
return this.docs.length === this.docs.filter(function(doc) {
return typeof(doc.foo) !== "undefined" && doc.foo !== null ;}).length
})
Dalším způsobem, jak toho dosáhnout, je spustit dva dotazy:Jeden pro načtení _id
ze všech dokumentů, které neodpovídají vašim kritériím pomocí distinct()
metoda:
var unwantedIds = db.collection.distinct( "_id", { "docs": { "$elemMatch": { "foo": { "$exists": false } } } } );
Poté použijte $nin
operátora vrátit všechny dokumenty, které odpovídají vašim kritériím.
db.collection.find({ "_id": { "$nin": unwantedIds } } )
Můžete také použít .aggregate()
metoda, ale funguje to pouze v případě, že máte verzi 3.2 nebo novější, protože musíte použít $filter
První fází v procesu je $match
fázi, kdy odfiltrujete ty dokumenty, kde pole "foo" chybí. Tím se sníží celkový počet dokumentů, které budou zpracovány. Další a poslední fází je $redact
etapa. V této fázi musíte použít $size
operátor, který vrátí velikost pole "docs" a velikost pole dílčích dokumentů, kde je přítomen "foo", a vrátí všechny dokumenty, kde jsou dvě hodnoty stejné.
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"
]
}}
])