Beberapa kondisi kecocokan untuk elemen array yang sama

Saya memiliki koleksi bernama perangkat dengan sekitar 50.000 dokumen. Saya mencoba menanyakan array rute dalam setiap dokumen dan mengembalikan dokumen jika beberapa kondisi terpenuhi untuk elemen array individual. Masalahnya adalah tampaknya Mongo memberikan jawaban yang memenuhi beberapa kondisi untuk elemen array yang berbeda.

Contoh data:

{
    "_id": 0,
    "name": "example1",
    "serial": "123456",
    "routes": [
        {
            "description": "8989",
            "zone": "front"
        },
        {
            "description": "1221",
            "zone": "back"
        }
    ]
},
{
    "_id": 1,
    "name": "example2",
    "serial": "987654",
    "routes": [
        {
            "description": "1515",
            "zone": "front"
        },
        {
            "description": "8989",
            "zone": "side"
        }
    ]
}

Saya sudah mencoba variasi .find() sederhana tetapi tidak berhasil

db.devices.find({"routes.description":"8989", "routes.zone":"front"})
db.devices.find({"$and": [{"routes.description":"8989"}, {"routes.zone":"front"}]})

Saya juga telah mencoba agregasi yang sepertinya gagal karena pemahaman saya tentangnya masih dasar. Hasil yang diinginkan untuk kueri di atas adalah satu dokumen (_id:0) dan bukan kedua dokumen.

{ "_id" : 0, "name" : "example1", "serial" : "123456", "routes" : [ { "description" : "8989", "zone" : "front" }, { "description" : "1221", "zone" : "back" } ] }

Selain itu, kemampuan untuk menanyakan array menggunakan operator $in juga diinginkan. Misalnya, keluaran yang diinginkan dari kueri berikut adalah kedua dokumen karena keduanya memiliki rute yang cocok dengan zone:front dan deskripsi yang ada dalam daftar.

db.devices.find({"$and": [{"routes.description": { $in: ["8989", "1515"] }}, {"routes.zone":"front"}]})

person r6danl99    schedule 31.08.2020    source sumber


Jawaban (1)


Anda hanya perlu menggunakan $elemMatch di sini

db.devices.find({routes: {$elemMatch: {description:"8989", zone:"front"}}})

Contoh

person namar sood    schedule 31.08.2020
comment
bisakah kamu menjawab ini? stackoverflow.com/questions/67600862 / - person Tejas Ratunawar; 19.05.2021