2013-06-24 10 views
5

मुझे दस्तावेजों के संग्रह के माध्यम से खोजने की ज़रूरत है, लेकिन किसी भी उप-दस्तावेज और प्रत्येक घटना में "एन" से "एन-जीबी" नामक एक फ़ील्ड का नाम बदलना है, मैंने इस कोड को आजमाया है लेकिन जावास्क्रिप्ट निष्पादन प्राप्त करना जारी रखा है: रेंज एरर: अधिकतम कॉल स्टैक आकार त्रुटि से अधिक है। समस्या पथ जानने के बिना फ़ंक्शन का उपयोग करके उप-दस्तावेज़ों के माध्यम से खोज रही है।मोंगोब रिकर्सिव खोज

remap = function (x) { 
    if (x.en){ 
     db.products.update({_id:x._id}, {$rename:{"en":"en-GB"}}, false, true); } 
for (var propt in x) { 
    if (Object.prototype.toString.call(x[propt]) === '[object Array]' || 
     Object.prototype.toString.call(x[propt]) === '[object Object]'){ 
     remap(x[propt]); 
    } 
} 

}

मैं भी इसी तरह की है कि बजाय एक कतार में शामिल करता है एक सरणी का उपयोग कर कुछ लिखा है, लेकिन इस तरह के "document.subdocument" के रूप में उप दस्तावेजों पथ सहेजने और फिर चलाने का कोई तरीका होना चाहिए यह फिर से क्षेत्र के लिए जांच के लिए समारोह के माध्यम से।

+0

वस्तु में एक परिपत्र संदर्भ हो सकता है? एक्स को वाई अंक, वाई अंक जेड, जेड एक्स को इंगित करता है? इससे एक ढेर अतिप्रवाह होगा। – Brandon

+0

आपको 'propt' के मान के बजाय 'x [propt]' का उपयोग करना चाहिए, क्योंकि यह केवल 'x' की संपत्ति का नाम है। – WiredPrairie

उत्तर

3

आप नीचे कुछ ऐसा करने की कोशिश कर सकते हैं।

सबसे पहले, बस संग्रह में सभी दस्तावेजों पर नाम बदलने का उपयोग करें:

db.products.update({}, {$rename:{"en":"en-GB"}}, false, true); 

ऐसा करने का कोई कारण ही remap समारोह में। इसके अलावा, आपके द्वारा उपयोग किए गए वाक्यविन्यास का अर्थ है en से en-GB पर अपडेट करके सभी दस्तावेज़ (एक विशिष्ट दस्तावेज़ नहीं) को अपडेट करें। फिर, प्रत्येक दस्तावेज़ के सभी गुण लूप करने के लिए अपने remap समारोह को संशोधित,

db.products.update({_id : x._id}, {$rename:{"en":"en-GB"}}, false, true); 

:

आप सिर्फ एक विशेष दस्तावेज़ अद्यतन करने के लिए चाहता था, तो आप उदाहरण के लिए _id द्वारा दस्तावेज़ को निर्दिष्ट करने की आवश्यकता होगी और मूल्य को पकड़ें और इसके प्रकार की जांच करें:

var remap = function (x) { 
    for (var propt in x) { 
     var val = x[propt]; 
     var type = Object.prototype.toString.call(val); 
     if (type === '[object Array]' || type === '[object Object]') { 
      remap(val); 
     } 
    } 
}; 

इसे बार-बार दिखाया जा सकता है। हालांकि, यह उप-वस्तुओं के गुणों का नाम नहीं बदलेगा। यह अधिक जटिल है और आपको प्रत्येक के लिए पूर्ण दस्तावेज़ में पास करने की आवश्यकता होगी, इसे बार-बार बनाए रखें, और फिर दस्तावेज़ के सभी गुणों को एक साथ अपडेट करें (संपत्ति पथ का उपयोग करके, "subobject.locale" या पूरे दस्तावेज़ को सहेजना)। Arrays को जगह में और अधिक कठिन हो सकता है, क्योंकि आपको ऑब्जेक्ट को सरणी में निकालना होगा, और इसे नए संशोधनों (या सरणी अनुक्रमणिका विनिर्देशों का उपयोग करें) के साथ उसी इंडेक्स पर पुन: सम्मिलित करना होगा। यदि आप पूरे दस्तावेज़ को सहेजते हैं, तो आप उन्हें सभी जगहों पर संशोधित कर सकते हैं, जो आसान होगा।

ईमानदारी से, मैं इस बिंदु पर खोल से बजाए अपनी पसंदीदा प्रोग्रामिंग भाषा का उपयोग करके ऐसा करूँगा।

+0

क्या उप-दस्तावेज़ पथ जैसे "product.description" को एक स्ट्रिंग में सहेजना संभव है जिसे मैं फ़ंक्शन के माध्यम से चला सकता हूं। मुझे एक ही क्षेत्र के लिए सभी दस्तावेजों और सभी उप-दस्तावेज़ों को स्कैन करने का एक तरीका चाहिए, और फिर इसका नाम बदलने की आवश्यकता है। –

+0

प्रोग्रामिंग भाषा के आधार पर, हां। यदि यह सिर्फ एक जावास्क्रिप्ट ऑब्जेक्ट है, तो आप केवल आवश्यक गुण सेट करेंगे। – WiredPrairie

संबंधित मुद्दे