सबसे पहले, ध्यान दें कि आपका सॉर्ट उदाहरण विकृत है:कुल विधि इनपुट के रूप में एक सरणी लेती है, जहां सरणी में प्रत्येक तत्व एकत्रीकरण पाइपलाइन में एक चरण निर्दिष्ट करता है। साथ ही, ध्यान दें कि $elemMatch $सॉर्ट चरण के भाग के रूप में ऑपरेटर का उपयोग नहीं किया जा सकता है।
आप अपने सॉर्ट उदाहरण के साथ जो करने का प्रयास कर रहे हैं उसे प्राप्त करने का एक तरीका एकत्रीकरण ढांचे के $खोलें पाइपलाइन ऑपरेटर। किसी ऐरे को खोलने से ऐरे के तत्वों को एक-एक करके अलग-अलग दस्तावेज़ों में खोल दिया जाएगा। उदाहरण के लिए, निम्न क्वेरी
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 चरण जोड़ने से आप केवल उन्हीं दस्तावेज़ों को प्राप्त कर सकेंगे जहाँ answer.id शून्य है। अंत में, एक $sort चरण आपको answer.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 या यहां तक कि एकत्रीकरण ढांचे की आवश्यकता होगी। यदि इसके बजाय आप दस्तावेज़ को answer.id के साथ 0 के बराबर और answer.value 3.5 के बराबर ढूंढना चाहते हैं, और फिर answer.value को 4 में बदलना चाहते हैं, तो आप $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;
}
}