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