$ where
を使用する
オペレーター。
db.collection.find(function() {
return this.docs.length === this.docs.filter(function(doc) {
return typeof(doc.foo) !== "undefined" && doc.foo !== null ;}).length
})
これを行う別の方法は、2つのクエリを実行することです。1つは _id
を取得するためのクエリです。 distinct()
方法:
var unwantedIds = db.collection.distinct( "_id", { "docs": { "$elemMatch": { "foo": { "$exists": false } } } } );
次に、 $ nin
を使用します 演算子を使用して、条件に一致するすべてのドキュメントを返します。
db.collection.find({ "_id": { "$nin": unwantedIds } } )
<を使用することもできます。 code> .aggregate()
メソッドですが、これはバージョン3.2以降を使用している場合にのみ機能します。これは、 $ filter
パイプラインの最初の段階は、 $ match
です。
「foo」フィールドがないドキュメントを除外するステージ。これにより、パイプで処理されるドキュメントの総数が減ります。次の最後の段階は、 $ redact
です。
ステージ。この段階では、 $ size
を使用する必要があります 演算子を使用して、「docs」フィールドのサイズと「foo」が存在するサブドキュメントの配列のサイズを返し、2つの値が等しいすべてのドキュメントを返します。
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"
]
}}
])