Sử dụng $where
nhà điều hành.
db.collection.find(function() {
return this.docs.length === this.docs.filter(function(doc) {
return typeof(doc.foo) !== "undefined" && doc.foo !== null ;}).length
})
Một cách khác để thực hiện việc này là chạy hai truy vấn:Một để truy xuất _id
trong số tất cả các tài liệu không phù hợp với tiêu chí của bạn bằng cách sử dụng distinct()
phương pháp:
var unwantedIds = db.collection.distinct( "_id", { "docs": { "$elemMatch": { "foo": { "$exists": false } } } } );
Sau đó, sử dụng $nin
toán tử để trả lại tất cả các tài liệu phù hợp với tiêu chí của bạn.
db.collection.find({ "_id": { "$nin": unwantedIds } } )
Bạn cũng có thể sử dụng .aggregate()
nhưng điều này chỉ hoạt động nếu bạn đang sử dụng phiên bản 3.2 hoặc mới hơn vì bạn cần sử dụng $filter
Giai đoạn đầu tiên trong quy trình là $match
giai đoạn mà bạn lọc ra những tài liệu không có trường "foo". Điều này làm giảm tổng số tài liệu sẽ được xử lý xuống đường ống. Giai đoạn tiếp theo và cuối cùng là $redact
sân khấu. Trong giai đoạn này, bạn cần sử dụng $size
toán tử để trả về kích thước của trường "docs" và kích thước của mảng tài liệu con trong đó "foo" có mặt và trả về tất cả những tài liệu có hai giá trị bằng nhau.
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"
]
}}
])