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;
}
}