S MongoDB 3.6 a novějšími můžete použít $expr
operátor ve vašem find()
dotaz. To vám umožňuje vytvářet výrazy dotazu, které porovnávají pole ze stejného dokumentu v $match
fázi.
db.customer.find({ "$expr": { "$eq": [{ "$month": "$bday" }, 9] } })
U ostatních verzí MongoDB zvažte spuštění agregačního kanálu, který používá $redact
operátor, protože vám umožňuje začlenit do jediného kanálu funkcionalitu s $project
k vytvoření pole, které představuje pole měsíce data a $match
filtrovat dokumenty, které odpovídají dané podmínce měsíce září.
Ve výše uvedeném $redact
používá $cond
tenary operátor jako prostředek k poskytnutí podmíněného výrazu, který vytvoří systémovou proměnnou, která provádí redigování. Logický výraz v $cond
zkontroluje shodu pole operátoru data s danou hodnotou, pokud se tato hodnota shoduje, pak $redact
vrátí dokumenty pomocí $$KEEP
systémovou proměnnou a zahodí jinak pomocí $$PRUNE
.
Spuštění následujícího kanálu by vám mělo poskytnout požadovaný výsledek:
db.customer.aggregate([
{ "$match": { "bday": { "$exists": true } } },
{
"$redact": {
"$cond": [
{ "$eq": [{ "$month": "$bday" }, 9] },
"$$KEEP",
"$$PRUNE"
]
}
}
])
Je to podobné jako u $project
+$match
combo, ale budete muset vybrat všechna zbývající pole, která jdou do kanálu:
db.customer.aggregate([
{ "$match": { "bday": { "$exists": true } } },
{
"$project": {
"month": { "$month": "$bday" },
"bday": 1,
"field1": 1,
"field2": 1,
.....
}
},
{ "$match": { "month": 9 } }
])
S dalším alternativním, i když pomalým dotazem, pomocí find()
metoda s $where
jako:
db.customer.find({ "$where": "this.bday.getMonth() === 8" })