Dengan MongoDB 3.6 dan yang lebih baru, Anda dapat menggunakan $expr
operator di find()
. Anda pertanyaan. Ini memungkinkan Anda membuat ekspresi kueri yang membandingkan bidang dari dokumen yang sama dalam $match
panggung.
db.customer.find({ "$expr": { "$eq": [{ "$month": "$bday" }, 9] } })
Untuk versi MongoDB lainnya, pertimbangkan untuk menjalankan pipa agregasi yang menggunakan $redact
operator karena memungkinkan Anda untuk menggabungkan dengan satu saluran, sebuah fungsi dengan $project
untuk membuat bidang yang mewakili bulan bidang tanggal dan $match
untuk menyaring dokumen yang sesuai dengan kondisi bulan yang diberikan September.
Di atas, $redact
menggunakan $cond
operator tenary sebagai sarana untuk memberikan ekspresi kondisional yang akan membuat variabel sistem yang melakukan redaksi. Ekspresi logis dalam $cond
akan memeriksa kesetaraan bidang operator tanggal dengan nilai yang diberikan, jika cocok maka $redact
akan mengembalikan dokumen menggunakan $$KEEP
variabel sistem dan membuang sebaliknya menggunakan $$PRUNE
.
Menjalankan pipeline berikut akan memberi Anda hasil yang diinginkan:
db.customer.aggregate([
{ "$match": { "bday": { "$exists": true } } },
{
"$redact": {
"$cond": [
{ "$eq": [{ "$month": "$bday" }, 9] },
"$$KEEP",
"$$PRUNE"
]
}
}
])
Ini mirip dengan $project
+$match
kombo tetapi Anda harus memilih semua bidang lainnya yang masuk ke dalam pipeline:
db.customer.aggregate([
{ "$match": { "bday": { "$exists": true } } },
{
"$project": {
"month": { "$month": "$bday" },
"bday": 1,
"field1": 1,
"field2": 1,
.....
}
},
{ "$match": { "month": 9 } }
])
Dengan alternatif lain, meskipun kueri lambat, menggunakan find()
metode dengan $where
sebagai:
db.customer.find({ "$where": "this.bday.getMonth() === 8" })