Първо, обърнете внимание, че вашият пример за сортиране е неправилно образуван:методът за агрегиране приема масив като вход, където всеки елемент в масива указва етап в тръбопровода за агрегиране. Също така имайте предвид, че $elemMatch операторът не може да се използва като част от етап $sort.
Един от начините да постигнете това, което се опитвате да направите с вашия пример за сортиране, е да използвате $unwind оператор на тръбопровод. Развиването на масив ще отдели елементите на масива един по един в отделни документи. Например следната заявка
db.my_collection.aggregate([ {$unwind: "$answers"} ]);
връща нещо като следното:
[
{
"_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"
}
}
]
Добавянето на $match фаза ще ви позволи да вземете само документите, където answers.id е нула. И накрая, фазата на $sort ви позволява да сортирате по answers.value. Като цяло заявката за агрегиране е:
db.my_collection.aggregate([
{$unwind: "$answers"},
{$match: {"answers.id": 0}},
{$sort: {"answers.value": -1}}
]);
И резултатът:
[
{
"_id" : ObjectId("5237157f3fac8e36fdb0b96e"),
"user" : "bruno",
"answers" : {
"id" : 0,
"value" : 3.5
}
},
{
"_id" : ObjectId("523715813fac8e36fdb0b96f"),
"user" : "bruno2",
"answers" : {
"id" : 0,
"value" : 0.5
}
}
]
Въз основа на това, което питате, не изглежда винаги да имате нужда от $unwind или дори от рамката за агрегиране. Ако вместо това искате да намерите документа с answers.id, равен на 0 и answers.value, равен на 3,5, и след това промените answers.value на 4, можете да използвате find с $elemMatch, последван от 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;
}
}