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" })