चूंकि आप दस्तावेज़ पर समूह बना रहे हैं _id
आप बस उन फ़ील्ड को रख सकते हैं जिन्हें आप समूह में रखना चाहते हैं _id
. फिर आप $project<का उपयोग करके पुनः फॉर्म कर सकते हैं /कोड>
db.c.aggregate([
{ "$unwind": "$array_to_sort"},
{ "$sort": {"array_to_sort.b":1, "array_to_sort:a": 1}},
{ "$group": {
"_id": {
"_id": "$_id",
"unknown_field": "$unknown_field"
},
"Oarray_to_sort": { "$push":"$array_to_sort"}
}},
{ "$project": {
"_id": "$_id._id",
"unknown_field": "$_id.unknown_field",
"array_to_sort": "$Oarray_to_sort"
}}
]);
वहां अन्य "चाल" समूहीकरण चरण में सरणी के लिए अस्थायी नाम का उपयोग कर रही है। ऐसा तब होता है जब आप $project
और नाम बदलें, आपको प्रोजेक्शन स्टेटमेंट में निर्दिष्ट क्रम में फ़ील्ड मिलते हैं। यदि आपने ऐसा नहीं किया है, तो "array_to_sort" फ़ील्ड क्रम में अंतिम फ़ील्ड नहीं होगी, क्योंकि इसे पिछले चरण से कॉपी किया गया है।
यह $project
में एक इच्छित अनुकूलन है। कोड>
, लेकिन अगर आप आदेश चाहते हैं तो आप इसे ऊपर के रूप में कर सकते हैं।
पूरी तरह से अज्ञात संरचनाओं के लिए mapReduce चीजों को करने का तरीका है:
db.c.mapReduce(
function () {
this["array_to_sort"].sort(function(a,b) {
return a.a - b.a || a.b - b.b;
});
emit( this._id, this );
},
function(){},
{ "out": { "inline": 1 } }
)
बेशक इसका एक आउटपुट स्वरूप है जो mapReduce के लिए विशिष्ट है और इसलिए आपके पास बिल्कुल दस्तावेज़ नहीं है, लेकिन सभी फ़ील्ड "मान" के अंतर्गत निहित हैं:
{
"results" : [
{
"_id" : 0,
"value" : {
"_id" : 0,
"some_field" : "a",
"array_to_sort" : [
{
"a" : 1,
"b" : 0
},
{
"a" : 3,
"b" : 3
},
{
"a" : 3,
"b" : 4
}
]
}
}
],
}
भविष्य की रिलीज़ (लेखन के रूप में) आपको $$ROOT
. का उपयोग करने की अनुमति देती है दस्तावेज़ का प्रतिनिधित्व करने के लिए कुल मिलाकर चर:
db.c.aggregate([
{ "$project": {
"_id": "$$ROOT",
"array_to_sort": "$array_to_sort"
}},
{ "$unwind": "$array_to_sort"},
{ "$sort": {"array_to_sort.b":1, "array_to_sort:a": 1}},
{ "$group": {
"_id": "$_id",
"array_to_sort": { "$push":"$array_to_sort"}
}}
]);
इसलिए अंतिम "प्रोजेक्ट" चरण का उपयोग करने का कोई मतलब नहीं है क्योंकि आप वास्तव में दस्तावेज़ के अन्य क्षेत्रों को नहीं जानते हैं। लेकिन वे सभी _id
. के भीतर समाहित होंगे (मूल सरणी और क्रम सहित) परिणाम दस्तावेज़ का क्षेत्र।