Tolong berikan penjelasan tentang permintaan MongoDB ini.

db.inventory.find({ qty : { $all : [ { $elemMatch : { size: "M", num : { $gt : 40},color : "green" }} ,{ $elemMatch : { num :100 , color : "green"}}  ]}}).pretty()
1
Jarvis42 21 November 2017, 09:48

1 menjawab

Jawaban Terbaik

Ok jadi bayangkan kita memiliki dokumen berikut:

/* 1 */
{
    "_id" : ObjectId("5a148f114d8a2fe38bec772a"),
    "samplearray" : [ 
        {
            "size" : "M",
            "num" : 45,
            "color" : "black"
        }, 
        {
            "size" : "L",
            "num" : 75,
            "color" : "blue"
        }
    ]
}

Di sini samplearray memiliki dua entri

1

Kueri ini:

db.sample.find({ samplearray: { $elemMatch: { num: { $gt: 41 }}}})

Akan mengembalikan dokumen. Dalam kueri kami meminta entri nilai larik di mana num lebih besar dari 41.

2

Sekarang jika kita melakukan kueri ini:

db.sample.find({ samplearray: { $elemMatch: { num: { $gte: 50 }, color: "black"}}})

Seharusnya tidak mengembalikan apa pun. Karena $elemMatch melihat ke dalam setiap entri nilai larik yang terpisah. Dan sekarang dokumennya tidak cocok. Karena dalam satu larik kita tidak memiliki entri nilai larik yang memenuhi kedua kondisi tersebut. Dalam dokumen kami memiliki entri array yang memenuhi num: { $gte: 50 } (contoh:

{
  "size" : "L",
  "num" : 75,
  "color" : "blue"
}

)

Dan satu untuk color: "black" (contoh:

{
   "size" : "M",
   "num" : 45,
   "color" : "black"
}

), tetapi tidak keduanya dalam satu.

3

Jika kami ingin mendapatkan dokumen sebagai hasilnya, maka kami harus menulis ulang kueri kami dan di sinilah kami memperkenalkan $all:

db.sample.find({
    samplearray: {
        $all: [{
                $elemMatch: {
                    num: {
                        $gte: 50
                    }
                }
            },
            {
                $elemMatch: {
                    color: "black"
                }
            }
        ]
    }
})

Apakah Anda mengerti sekarang $all dan $elemMatch sedikit lebih baik?

4
Community 20 Juni 2020, 09:12