W MongoDB 3.6 i nowszych możesz użyć $expr operator w find() zapytanie. Pozwala to na tworzenie wyrażeń zapytań, które porównują pola z tego samego dokumentu w $match scena.
db.customer.find({ "$expr": { "$eq": [{ "$month": "$bday" }, 9] } })
W przypadku innych wersji MongoDB rozważ uruchomienie potoku agregacji, który używa $redact operatora, ponieważ pozwala na włączenie do jednego potoku funkcji z $project aby utworzyć pole reprezentujące miesiąc pola daty i $match do filtrowania dokumentów, które pasują do danego miesiąca września.
W powyższym, $redact używa $cond operator tenarny jako środek do dostarczenia wyrażenia warunkowego, które utworzy zmienną systemową, która wykonuje redakcję. Wyrażenie logiczne w $cond sprawdzi równość pola operatora daty z podaną wartością, jeśli to pasuje, to $redact zwróci dokumenty za pomocą $$KEEP zmienna systemowa i odrzuca w inny sposób za pomocą $$PRUNE .
Uruchomienie następującego potoku powinno dać pożądany rezultat:
db.customer.aggregate([
{ "$match": { "bday": { "$exists": true } } },
{
"$redact": {
"$cond": [
{ "$eq": [{ "$month": "$bday" }, 9] },
"$$KEEP",
"$$PRUNE"
]
}
}
])
Jest to podobne do $project +$match combo, ale musisz wtedy zaznaczyć wszystkie pozostałe pola, które trafiają do potoku:
db.customer.aggregate([
{ "$match": { "bday": { "$exists": true } } },
{
"$project": {
"month": { "$month": "$bday" },
"bday": 1,
"field1": 1,
"field2": 1,
.....
}
},
{ "$match": { "month": 9 } }
])
Z inną alternatywą, aczkolwiek powolnym zapytaniem, używając find() metoda z $where jako:
db.customer.find({ "$where": "this.bday.getMonth() === 8" })