MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

MongoDB mencocokan beberapa elemen dalam array

Anda tidak dapat mengembalikan beberapa elemen larik yang cocok dengan kriteria Anda dalam bentuk .find() basic dasar apa pun pertanyaan. Untuk mencocokkan lebih dari satu elemen, Anda perlu menggunakan .aggregate() sebagai gantinya.

Perbedaan utama di sini adalah bahwa "kueri" melakukan persis apa yang dimaksudkan untuk dilakukan dan cocok dengan "dokumen" yang memenuhi kondisi Anda. Anda dapat mencoba menggunakan $ . posisional operator dalam argumen proyeksi, tetapi aturannya hanya akan cocok dengan elemen larik "pertama" yang cocok dengan kondisi kueri.

Untuk "memfilter" beberapa elemen larik, lakukan sebagai berikut:

db.sample.aggregate([
    // Filter possible documents
    { "$match": { "filtermetric.class": "s2" } },

    // Unwind the array to denormalize
    { "$unwind": "$filtermetric" },

    // Match specific array elements
    { "$match": { "filtermetric.class": "s2" } },

    // Group back to array form
    { "$group": {
        "_id": "$_id",
        "filtermetric": { "$push": "$filtermetric" }
    }}
])

Di MongoDB versi modern yang merupakan versi 2.6 atau lebih tinggi, Anda dapat melakukannya dengan $redact :

db.sample.aggregate([
    // Filter possible documents
    { "$match": { "filtermetric.class": "s2" } },

    // Redact the entries that do not match
    { "$redact": {
        "$cond": [
            { "$eq": [ { "$ifNull": [ "$class", "s2" ] }, "s2" ] },
            "$$DESCEND",
            "$$PRUNE"
        ]
    }}
])

Itu mungkin pilihan Anda yang paling efisien, tetapi ini rekursif jadi pertimbangkan struktur dokumen Anda terlebih dahulu karena bidang bernama yang sama tidak dapat ada dengan kondisi lain di tingkat mana pun.

Mungkin lebih aman tetapi hanya berguna jika hasil dalam larik "benar-benar unik" adalah teknik ini dengan $map dan $setDifference :

db.sample.aggregate([
    { "$project": {
        "filtermetric": { "$setDifference": [
            { "$map": [
                "input": "$filtermetric",
                "as": "el",
                "in": {"$cond": [
                    { "$eq": [ "$$el.class", "s2" ] },
                    "$$el",
                    false
                ]}
            ]},
            [false]
        ]}
    }}
])

Perhatikan juga bahwa di kedua $group dan $project tahapan pipa operasional yang butuhkan untuk menentukan semua bidang yang ingin Anda kembalikan dalam dokumen hasil Anda dari tahap itu.

Catatan terakhir adalah $elemMatch tidak diperlukan ketika Anda hanya menanyakan nilai dari satu kunci dalam sebuah array. "Notasi titik" lebih disukai dan direkomendasikan ketika hanya mengakses satu kunci larik. $elemMatch seharusnya hanya diperlukan ketika "beberapa" kunci dalam dokumen dalam "elemen" larik harus cocok dengan kondisi kueri.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bagaimana Mengelola Database Besar Secara Efektif

  2. MongoDB $isNumber

  3. Tidak dapat terhubung ke mongodb errno:61 Koneksi ditolak

  4. Upsert Cepat atau Massal di pymongo

  5. Mongoose.js:Temukan pengguna dengan nama pengguna LIKE nilai