आधुनिक मोंगोडीबी रिलीज में मौजूदा दस्तावेज़ गुणों का उपयोग करके सरणी को केवल नोट करना सबसे प्रभावी तरीका है। MongoDB 3.2 में सरणियों का प्रत्यक्ष संकेतन पेश किया गया था:
db.collection.aggregate([
{ "$project": {
"lat": 1,
"long": 1,
"geometry": {
"type": { "$literal": "Point" },
"coordinates": [ "$lat", "$long" ]
}
}},
{ "$out": "newcollection" }
])
या यहां तक कि $addFields
का इस्तेमाल भी कर सकते हैं
दस्तावेज़ों में नई संपत्ति को केवल "संलग्न" करने के लिए:
db.collection.aggregate([
{ "$addFields": {
"geometry": {
"type": { "$literal": "Point" },
"coordinates": [ "$lat", "$long" ]
}
}},
{ "$out": "newcollection" }
])
यदि आप MongoDB 2.6 और इसके बाद के संस्करण का उपयोग कर रहे हैं तो आप इसे एकत्रीकरण ढांचे के साथ कर सकते हैं और एक नया संग्रह बनाने के लिए अपने क्लाइंट प्रोग्राम में लूपिंग परिणामों से बच सकते हैं।
यहां मुख्य विशेषता जो आपकी मदद करती है, वे हैं $ बाहर
आउटपुट को नए संग्रह में भेजने के लिए ऑपरेटर। लेकिन आपको जिस सरणी की आवश्यकता है उसे बनाने के लिए थोड़ा चतुर भी होना चाहिए।
db.collection.aggregate([
{ "$project": {
"lat": 1,
"long": 1,
"type": { "$literal": ["lat","long"] }
}},
{ "$unwind": "$type" },
{ "$group": {
"_id": "$_id",
"lat": { "$first": "$lat" },
"long": { "$first": "$long" },
"coordinates": {
"$push": {
"$cond": [
{ "$eq": [ "$type", "lat" ] },
"$lat",
"$long"
]
}
}
}},
{ "$project": {
"lat": 1,
"long": 1,
"geometry": {
"type": { "$literal": "Point" },
"coordinates": "$coordinates"
}
}},
{ "$out": "newcollection" }
])
तो यह $literalका उपयोग करता है कोड>
पाइपलाइन के शीर्ष पर एक नया सरणी निर्दिष्ट करने के लिए ऑपरेटर। यह ऑपरेटर सामग्री को दस्तावेज़ संपत्ति में रखेगा बिल्कुल इसकी आपूर्ति कैसे की जाती है। इसलिए किसी भी परिवर्तनशील प्रतिस्थापन की अनुमति नहीं है, इसलिए "शाब्दिक"।
"समन्वय" सरणी बनाने के लिए, हम बस उस पहली सरणी को खोलते हैं जो अनिवार्य रूप से "प्रकार" में एक अलग मूल्य के साथ प्रत्येक दस्तावेज़ में से दो बनाती है। इसके बाद इसका उपयोग $groupमें किया जाता है। कोड>
सशर्त रूप से चरण $push
या तो उस सरणी पर "$lat" या "$long" मान।
अंत में $project
का उपयोग करें
दस्तावेज़ संरचना को अंतिम रूप देने के लिए और फिर $out
सभी आउटपुट को नए संग्रह में भेजता है।
ध्यान दें कि यह केवल तभी समझ में आता है जब आपका इरादा एक नया संग्रह बनाना और "ओवर द वायर" ट्रैफ़िक भेजने से बचना है। यह आपके दस्तावेज़ को फिर से आकार देने के इरादे से एकत्रीकरण ढांचे के भीतर पूरी तरह से उपयोग नहीं किया जा सकता है, फिर उसी एकत्रीकरण पाइपलाइन में "भू-स्थानिक" क्वेरी करने के इरादे से "भू-स्थानिक" प्रश्न केवल तभी काम करेंगे जब वास्तव में संग्रह पर अनुक्रमित किया जाएगा ।
तो यह आपको एक नया संग्रह बनाने में मदद कर सकता है जैसा आप चाहते हैं, लेकिन कम से कम यह उदाहरण (या वास्तव में दो उदाहरण) के रूप में कार्य करता है कि कैसे समेकन ढांचे के साथ विभिन्न मूल्यों से एक सरणी बनाई जाए।