Với MongoDB 3.6 và mới hơn, bạn có thể sử dụng $expr
toán tử trong find()
của bạn truy vấn. Điều này cho phép bạn tạo biểu thức truy vấn so sánh các trường từ cùng một tài liệu trong một $match
sân khấu.
db.customer.find({ "$expr": { "$eq": [{ "$month": "$bday" }, 9] } })
Đối với các phiên bản MongoDB khác, hãy cân nhắc chạy đường dẫn tổng hợp sử dụng $redact
vì nó cho phép bạn kết hợp với một đường dẫn duy nhất, một chức năng với $project
để tạo trường đại diện cho tháng của trường ngày và $match
để lọc các tài liệu phù hợp với điều kiện nhất định của tháng là tháng chín.
Trong phần trên, $redact
sử dụng $cond
toán tử tenary như là phương tiện để cung cấp biểu thức điều kiện sẽ tạo ra biến hệ thống thực hiện thao tác lặp lại. Biểu thức logic trong $cond
sẽ kiểm tra sự bình đẳng của trường toán tử ngày với một giá trị nhất định, nếu giá trị đó khớp với thì $redact
sẽ trả lại các tài liệu bằng cách sử dụng $$KEEP
biến hệ thống và loại bỏ nếu không sử dụng $$PRUNE
.
Chạy đường dẫn sau sẽ cho bạn kết quả mong muốn:
db.customer.aggregate([
{ "$match": { "bday": { "$exists": true } } },
{
"$redact": {
"$cond": [
{ "$eq": [{ "$month": "$bday" }, 9] },
"$$KEEP",
"$$PRUNE"
]
}
}
])
Điều này tương tự với $project
+ $match
nhưng sau đó bạn cần chọn tất cả các trường còn lại đi vào đường dẫn:
db.customer.aggregate([
{ "$match": { "bday": { "$exists": true } } },
{
"$project": {
"month": { "$month": "$bday" },
"bday": 1,
"field1": 1,
"field2": 1,
.....
}
},
{ "$match": { "month": 9 } }
])
Với một giải pháp thay thế khác, mặc dù truy vấn chậm, sử dụng find()
với $where
như:
db.customer.find({ "$where": "this.bday.getMonth() === 8" })