Med MongoDB 3.6 og nyere kan du bruge $expr operator i din find() forespørgsel. Dette giver dig mulighed for at bygge forespørgselsudtryk, der sammenligner felter fra det samme dokument i en $match scene.
db.customer.find({ "$expr": { "$eq": [{ "$month": "$bday" }, 9] } })
For andre MongoDB-versioner kan du overveje at køre en aggregeringspipeline, der bruger $redact operatør, da det giver dig mulighed for at inkorporere med en enkelt pipeline, en funktionalitet med $project for at oprette et felt, der repræsenterer måneden for et datofelt og $match at filtrere de dokumenter, der matcher månedens givne tilstand, nemlig september.
I ovenstående, $redact bruger $cond tenæroperator som et middel til at give det betingede udtryk, der vil skabe den systemvariabel, der udfører redaktionen. Det logiske udtryk i $cond vil kontrollere for en lighed af et datooperatorfelt med en given værdi, hvis det matcher, så $redact returnerer dokumenterne ved hjælp af $$KEEP systemvariabel og kasserer ellers ved at bruge $$PRUNE .
Kørsel af følgende pipeline skulle give dig det ønskede resultat:
db.customer.aggregate([
{ "$match": { "bday": { "$exists": true } } },
{
"$redact": {
"$cond": [
{ "$eq": [{ "$month": "$bday" }, 9] },
"$$KEEP",
"$$PRUNE"
]
}
}
])
Dette ligner et $project +$match combo, men du skal derefter vælge alle de øvrige felter, der går ind i pipelinen:
db.customer.aggregate([
{ "$match": { "bday": { "$exists": true } } },
{
"$project": {
"month": { "$month": "$bday" },
"bday": 1,
"field1": 1,
"field2": 1,
.....
}
},
{ "$match": { "month": 9 } }
])
Med et andet alternativ, omend langsom forespørgsel, ved at bruge find() metode med $where som:
db.customer.find({ "$where": "this.bday.getMonth() === 8" })