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

Menggunakan agregasi untuk menyortir dalam kondisi kompleks di Mongodb

Pertama, perhatikan bahwa contoh pengurutan Anda salah format:metode agregat mengambil larik sebagai input, di mana setiap elemen dalam larik menentukan tahapan dalam saluran agregasi. Perhatikan juga bahwa $elemMatch operator tidak dapat digunakan sebagai bagian dari tahap $sort.

Salah satu cara untuk mencapai apa yang Anda coba lakukan dengan contoh pengurutan Anda adalah menggunakan kerangka agregasi $santai operator pipa. Membuka gulungan array akan mengupas elemen array satu per satu ke dalam dokumen terpisah. Misalnya, kueri berikut

db.my_collection.aggregate([ {$unwind: "$answers"} ]);

mengembalikan sesuatu seperti berikut:

[
    {
        "_id" : ObjectId("5237157f3fac8e36fdb0b96e"),
        "user" : "bruno",
        "answers" : {
            "id" : 0,
            "value" : 3.5
        }
    },
    {
        "_id" : ObjectId("5237157f3fac8e36fdb0b96e"),
        "user" : "bruno",
        "answers" : {
            "id" : 1,
            "value" : "hello"
        }
    },
    {
        "_id" : ObjectId("523715813fac8e36fdb0b96f"),
        "user" : "bruno2",
        "answers" : {
            "id" : 0,
            "value" : 0.5
        }
    },
    {
        "_id" : ObjectId("523715813fac8e36fdb0b96f"),
        "user" : "bruno2",
        "answers" : {
            "id" : 1,
            "value" : "world"
        }
    }
]

Menambahkan fase $match akan memungkinkan Anda untuk mengambil hanya dokumen di mana answer.id adalah nol. Terakhir, fase $sort memungkinkan Anda mengurutkan berdasarkan answer.value. Secara keseluruhan, kueri agregasi adalah:

db.my_collection.aggregate([
    {$unwind: "$answers"},
    {$match: {"answers.id": 0}},
    {$sort: {"answers.value": -1}}
]);

Dan hasilnya:

[
    {
        "_id" : ObjectId("5237157f3fac8e36fdb0b96e"),
        "user" : "bruno",
        "answers" : {
            "id" : 0,
            "value" : 3.5
        }
    },
    {
        "_id" : ObjectId("523715813fac8e36fdb0b96f"),
        "user" : "bruno2",
        "answers" : {
            "id" : 0,
            "value" : 0.5
        }
    }
]

Berdasarkan apa yang Anda minta, sepertinya Anda tidak akan selalu membutuhkan $unwind atau bahkan kerangka kerja agregasi. Jika sebaliknya Anda ingin menemukan dokumen dengan answer.id sama dengan 0 dan answer.value sama dengan 3,5, lalu ubah answer.value menjadi 4, Anda bisa menggunakan find dengan $elemMatch diikuti dengan db.collection.save():

doc = db.my_collection.findOne({"answers": {$elemMatch: {"id": 0, "value": 3.5}}});
for (i=0; i<doc.answers.length; i++) {
  if (doc.answers[i].id === 0) {
    doc.answers[i].value = 4;
    db.my_collection.save(doc);
    break;
  }
}



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cara menggunakan $regex dalam kueri agregasi mongodb dalam $match

  2. konektor wastafel kafka mongodb tidak mulai

  3. Meminta Data dari MongoDB menggunakan GraphQL di Django:Get-Go (1)

  4. PyMongo/Mongoengine setara dengan mongodump

  5. Pembaruan sebagian dari subdokumen dengan nodejs/luwak