Apakah ini berarti jika Anda menggunakan variabel input dalam $lookuppipeline, Anda harus menggunakan $expr
Ya benar, secara default di filter yaitu; di bagian filter .find()
atau di $match
tahap agregasi Anda tidak dapat menggunakan bidang yang ada di dokumen.
Jika sama sekali jika Anda perlu menggunakan nilai bidang yang ada di filter kueri Anda, maka Anda perlu menggunakan pipa agregasi, Jadi untuk menggunakan pipa agregasi di .find()
atau di $match
Anda perlu membungkus kueri filter Anda dengan $expr. Cara yang sama untuk mengakses variabel lokal dibuat menggunakan let
dari $lookup
filter di $match
perlu dibungkus dengan $expr
.
Mari kita perhatikan contoh di bawah ini :
Contoh Dokumen :
[
{
"key": 1,
"value": 2
},
{
"key": 2,
"value": 4
},
{
"key": 5,
"value": 5
}
]
Kueri :
db.collection.find({ key: { $gt: 1 }, value: { $gt: 4 } })
Or
db.collection.aggregate([ { $match: { key: { $gt: 1 }, value: { $gt: 4 } } } ])
Uji: taman bermain mongo
Jika Anda melihat kueri di atas, keduanya masukkan 1
&4
diteruskan ke kueri tetapi Anda memeriksa kueri di bawah tempat Anda mencoba mencocokkan key
bidang ==value
bidang - tidak berfungsi :
db.collection.aggregate([ { $match: { key: { $eq: "$value" } } } ])
Uji: taman bermain mongo
Di atas saat Anda membandingkan dua bidang yang ada maka Anda tidak dapat melakukannya karena itu berarti Anda memeriksa dokumen dengan key
nilai bidang sebagai string "$value"
. Jadi untuk mengatakan itu bukan string, itu sebenarnya referensi ke value
bidang Anda perlu menggunakan operator agregasi $eq daripada operator kueri $eq seperti di bawah ini :
db.collection.aggregate([ { $match: { $expr: { $eq: [ "$key", "$value" ] } } } ])
Uji: taman bermain mongo