С MongoDB 3.6 и по-нови, можете да използвате $expr
оператор във вашия find()
запитване. Това ви позволява да създавате изрази на заявка, които сравняват полета от един и същ документ в $match
етап.
db.customer.find({ "$expr": { "$eq": [{ "$month": "$bday" }, 9] } })
За други версии на MongoDB помислете за стартиране на конвейер за агрегация, който използва $redact
оператор, тъй като ви позволява да включите с един тръбопровод, функционалност с $project
за да създадете поле, което представлява месеца на поле за дата и $match
за филтриране на документите, които отговарят на даденото състояние на месеца септември.
В горното $redact
използва $cond
тенарен оператор като средство за предоставяне на условния израз, който ще създаде системната променлива, която извършва редакцията. Логическият израз в $cond
ще провери за равенство на полето на оператор за дата с дадена стойност, ако това съвпада, тогава $redact
ще върне документите с помощта на $$KEEP
системна променлива и изхвърля в противен случай с помощта на $$PRUNE
.
Изпълнението на следния конвейер трябва да ви даде желания резултат:
db.customer.aggregate([
{ "$match": { "bday": { "$exists": true } } },
{
"$redact": {
"$cond": [
{ "$eq": [{ "$month": "$bday" }, 9] },
"$$KEEP",
"$$PRUNE"
]
}
}
])
Това е подобно на $project
+$match
комбо, но след това ще трябва да изберете всички останали полета, които влизат в конвейера:
db.customer.aggregate([
{ "$match": { "bday": { "$exists": true } } },
{
"$project": {
"month": { "$month": "$bday" },
"bday": 1,
"field1": 1,
"field2": 1,
.....
}
},
{ "$match": { "month": 9 } }
])
С друга алтернатива, макар и бавна заявка, с помощта на find()
метод с $where
като:
db.customer.find({ "$where": "this.bday.getMonth() === 8" })