Menggunakan $where
operator.
db.collection.find(function() {
return this.docs.length === this.docs.filter(function(doc) {
return typeof(doc.foo) !== "undefined" && doc.foo !== null ;}).length
})
Cara lain untuk melakukannya adalah dengan menjalankan dua kueri:Satu untuk mengambil _id
dari semua dokumen yang tidak sesuai dengan kriteria Anda menggunakan distinct()
metode:
var unwantedIds = db.collection.distinct( "_id", { "docs": { "$elemMatch": { "foo": { "$exists": false } } } } );
Kemudian gunakan $nin
operator untuk mengembalikan semua dokumen yang sesuai dengan kriteria Anda.
db.collection.find({ "_id": { "$nin": unwantedIds } } )
Anda juga dapat menggunakan .aggregate()
tetapi ini hanya berfungsi jika Anda menggunakan versi 3.2 atau yang lebih baru karena Anda perlu menggunakan $filter
Tahap pertama dalam pipeline adalah $match
tahap di mana Anda menyaring dokumen-dokumen di mana bidang "foo" tidak ada. Ini mengurangi jumlah total dokumen yang akan diproses ke bawah pipa. Tahap selanjutnya dan terakhir adalah $redact
panggung. Pada tahap ini Anda perlu menggunakan $size
operator untuk mengembalikan ukuran bidang "dokumen" dan ukuran larik sub-dokumen di mana "foo" ada dan mengembalikan semua dokumen yang kedua nilainya sama.
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"
]
}}
])