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

dapatkan semua dokumen yang memiliki nilai maksimal menggunakan agregasi di mongodb

Jika Anda ingin menyimpan informasi dokumen, pada dasarnya Anda perlu $push itu menjadi sebuah array. Tapi tentu saja, kemudian memiliki $max nilai, Anda perlu memfilter konten array hanya untuk elemen yang cocok:

db.coll.aggregate([
    { "$group":{ 
        "_id": "$country",
        "maxQuantity": { "$max": "$quantity" },
        "docs": { "$push": {
            "_id": "$_id",
            "name": "$name",
            "quantity": "$quantity"
        }}
    }},
    { "$project": {
        "maxQuantity": 1,
        "docs": {
            "$setDifference": [
               { "$map": {
                   "input": "$docs",
                   "as": "doc",
                   "in": {
                       "$cond": [ 
                           { "$eq": [ "$maxQuantity", "$$doc.quantity" ] },
                           "$$doc",
                           false
                       ]
                   }
               }},
               [false]
            ]
        }
    }}
])

Jadi, Anda menyimpan semuanya dalam sebuah larik dan kemudian menguji setiap anggota larik untuk melihat apakah nilainya cocok dengan nilai maksimum yang tercatat, membuang yang tidak.

Saya akan menyimpan _id nilai dalam dokumen array karena itulah yang membuatnya "unik" dan tidak akan terpengaruh secara negatif oleh $setDifference saat menyaring nilai. Tapi tentu saja jika "nama" selalu unik maka tidak diperlukan.

Anda juga dapat mengembalikan bidang apa pun yang Anda inginkan dari $map , tapi saya hanya mengembalikan seluruh dokumen misalnya.

Perlu diingat bahwa ini memiliki batasan tidak melebihi batas ukuran BSON 16MB, jadi boleh saja untuk sampel data kecil, tetapi apa pun yang menghasilkan daftar yang berpotensi besar (karena Anda tidak dapat memfilter konten array sebelumnya) akan lebih baik diproses dengan kueri terpisah untuk menemukan nilai "maks", dan kueri lainnya untuk mengambil dokumen yang cocok.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bagaimana IAsyncCursor digunakan untuk iterasi dengan driver mongodb c#?

  2. bagaimana menemukan bidang model yang berbeda pada kondisi dan pada luwak?

  3. Menggunakan $exists dalam ekspresi MongoDB

  4. Bagaimana cara mengatur dan menghapus bersama dengan pembaruan agregat di mongodb?

  5. Saat menggunakan rmongodb, tidak dapat melihat koleksi di mongoDB