यह $lookup
. का "डिज़ाइन द्वारा" है कार्यान्वयन। क्या वास्तव में होता है "हुड के नीचे" MongoDB है आंतरिक $lookup
. में तर्कों को रूपांतरित करता है नए अभिव्यंजक . के लिए $expr
. का उपयोग करके प्रारूपित करें और $in
. यहां तक कि इससे पहले के संस्करणों में भी जब यह अभिव्यंजक प्रपत्र लागू किया गया था, एक "मानों की सरणी" . के लिए आंतरिक यांत्रिकी वास्तव में बहुत कुछ वैसा ही था।
यहां समाधान यह है कि "शामिल हुए" को पुन:क्रमित करने के लिए मूल सरणी की एक प्रति को संदर्भ के रूप में बनाए रखा जाए आइटम:
collection.aggregate([
{"$match": {"_id": ObjectId("5c781752176c512f180048e3") }},
{"$lookup": {
"from": "collection2",
"let": { "classIds": "$Classes.ID" },
"pipeline": [
{ "$match": {
"$expr": { "$in": [ "$_id", "$$classIds" ] }
}},
{ "$addFields": {
"sort": {
"$indexOfArray": [ "$$classIds", "$_id" ]
}
}},
{ "$sort": { "sort": 1 } },
{ "$addFields": { "sort": "$$REMOVE" }}
],
"as": "results"
}}
])
या विरासत $lookup
. द्वारा उपयोग:
collection.aggregate([
{"$match": {"_id": ObjectId("5c781752176c512f180048e3") }},
{"$lookup": {
"from": "collection2",
"localField": "Classes.ID",
"foreignField": "_id",
"as": "results"
}},
{ "$unwind": "$results" },
{ "$addFields": {
"sort": {
"$indexOfArray": [ "$Classes.ID", "$results._id" ]
}
}},
{ "$sort": { "_id": 1, "sort": 1 } },
{ "$group": {
"_id": "$_id",
"Name": { "$first": "$Name" },
"Classes": { "$first": "$Classes" },
"results": { "$push": "$results" }
}}
])
दोनों वेरिएंट एक ही आउटपुट देते हैं:
{
"_id" : ObjectId("5c781752176c512f180048e3"),
"Name" : "Pedro",
"Classes" : [
{
"ID" : ObjectId("5c7af2b2f6f6e47c9060d7ce")
},
{
"ID" : ObjectId("5c7af2bcf6f6e47c9060d7cf")
},
{
"ID" : ObjectId("5c7af2aaf6f6e47c9060d7cd")
}
],
"results" : [
{
"_id" : ObjectId("5c7af2b2f6f6e47c9060d7ce"),
"variable1" : "B"
},
{
"_id" : ObjectId("5c7af2bcf6f6e47c9060d7cf"),
"variable1" : "C"
},
{
"_id" : ObjectId("5c7af2aaf6f6e47c9060d7cd"),
"variable1" : "A"
}
]
}
$indexOfArray
. का उपयोग करने की सामान्य अवधारणा _id
. की तुलना में "शामिल हुए" . से मान सामग्री खोजने के लिए यह "सूचकांक" . है "$Classes.ID"
. से मूल स्रोत सरणी में स्थिति . अलग $lookup
आप इस प्रतिलिपि तक कैसे पहुंच सकते हैं, इसके लिए सिंटैक्स वेरिएंट के अलग-अलग दृष्टिकोण हैं और आप मूल रूप से कैसे पुनर्निर्माण करते हैं।
$sort
बेशक वास्तविक दस्तावेज़ों का क्रम सेट करता है, या तो पाइपलाइन प्रसंस्करण के अंदर अभिव्यंजक रूप के लिए, या $unwind
. के खुले दस्तावेज़ों के माध्यम से . जहां आपने $unwind
. का उपयोग किया है तब आप $group
मूल दस्तावेज़ फ़ॉर्म पर वापस जाएँ।
नोट :यहां उपयोग के उदाहरण $indexOfArray
. के लिए MongoDB 3.4 पर निर्भर करते हैं कम से कम और $$REMOVE
अभिव्यंजक . के रूप में MongoDB 3.6 के साथ संरेखित करता है $lookup
।
पूर्व रिलीज के लिए सरणी को फिर से ऑर्डर करने के अन्य तरीके हैं, लेकिन इन्हें मोंगोडीबी के $ इन क्लॉज गारंटी ऑर्डर पर अधिक विस्तार से प्रदर्शित किया गया है। वास्तविक रूप से न्यूनतम न्यूनतम जो आपको वर्तमान में एक उत्पादन MongoDB संस्करण के रूप में चलाना चाहिए वह 3.4 रिलीज़ है।
देखें समर्थन नीति MongoDB सर्वर के अंतर्गत समर्थित रिलीज़ और समाप्ति तिथियों के पूर्ण विवरण के लिए।