Med MongoDB 3.6 och senare kan du använda $expr
operatorn i din find()
fråga. Detta låter dig bygga frågeuttryck som jämför fält från samma dokument i en $match
skede.
db.customer.find({ "$expr": { "$eq": [{ "$month": "$bday" }, 9] } })
För andra MongoDB-versioner, överväg att köra en aggregeringspipeline som använder $redact
operatör eftersom den låter dig integrera med en enda pipeline, en funktionalitet med $project
för att skapa ett fält som representerar månaden för ett datumfält och $match
för att filtrera de dokument som matchar det givna villkoret för månaden som är september.
I ovanstående, $redact
använder $cond
tenary operator som ett medel för att tillhandahålla det villkorliga uttrycket som skapar systemvariabeln som gör redaktionen. Det logiska uttrycket i $cond
kommer att kontrollera om ett datumoperatorfält är lika med ett givet värde, om det stämmer överens med $redact
kommer att returnera dokumenten med $$KEEP
systemvariabel och kasserar annars med $$PRUNE
.
Att köra följande pipeline bör ge dig det önskade resultatet:
db.customer.aggregate([
{ "$match": { "bday": { "$exists": true } } },
{
"$redact": {
"$cond": [
{ "$eq": [{ "$month": "$bday" }, 9] },
"$$KEEP",
"$$PRUNE"
]
}
}
])
Detta liknar ett $project
+$match
combo men du måste sedan välja alla övriga fält som går in i pipelinen:
db.customer.aggregate([
{ "$match": { "bday": { "$exists": true } } },
{
"$project": {
"month": { "$month": "$bday" },
"bday": 1,
"field1": 1,
"field2": 1,
.....
}
},
{ "$match": { "month": 9 } }
])
Med ett annat alternativ, om än långsam fråga, med find()
metod med $where
som:
db.customer.find({ "$where": "this.bday.getMonth() === 8" })