$expr
memungkinkan penggunaan Operator Ekspresi Agregasi hanya . Notasi titik yang Anda gunakan tidak akan berfungsi untuk mengakses elemen larik untuk bidang "values" : [ 1 ]
. Anda perlu menggunakan $arrayElemAt
operator, dan berfungsi dengan baik.
Kode Anda find({$expr: {$eq: ["$value1", "$value2"]}})
bekerja, karena $expr
menggunakan operator ekspresi agregasi $eq
, tidak operator MongoDB Query Language (MQL) $eq . Perhatikan bahwa kedua operator terlihat sama, tetapi penggunaan dan sintaksnya berbeda.
Dan, kode find({$expr: {$eq: ["$value1", "$values.0"]}})
tidak bekerja - seperti yang diharapkan. Di operator agregasi $values.0
, 0
ditafsirkan sebagai nama bidang, bukan indeks bidang larik.
Notasi titik berfungsi dengan baik di $expr
juga. Berikut ini contohnya, dengan contoh dokumen:
{ "_id" : 1, "val" : { "0" : 99, "a" : 11 } }
Sekarang menggunakan $expr
dan notasi titik:
db.test.find({ $expr: { $eq: [ "$val.0", 99 ] } } )
db.test.find({ $expr: { $eq: [ "$val.a", 11 ] } } )
Kedua kueri mengembalikan dokumen - kecocokan terjadi dengan filter menggunakan $expr
dan notasi titik. Namun, ini hanya berlaku untuk dokumen yang disematkan (atau sub) tidak dengan bidang array.
Dari dokumentasi, Operator Agregasi Pipeline mengatakan:
ekspresi :