यदि आप पूरे संग्रह को अपडेट करने जा रहे हैं तो limit
आपके कर्सर पर आपके वर्तमान कोड में आवश्यक नहीं है। आपको जो त्रुटि मिल रही है वह है mappingData
products
. में फ़ील्ड संग्रह में array
नामक उप-दस्तावेज़ फ़ील्ड नहीं है . प्रश्न में आपके उदाहरण से, केवल title
उप-दस्तावेज़ फ़ील्ड उपलब्ध है, और वह वही है जो आप चाहते हैं।
उत्पाद संग्रह के आकार के आधार पर, परिवर्तित दस्तावेज़ों को नए संग्रह में सम्मिलित करना आपके कार्यों को प्रभावित कर सकता है। आप नए अनियंत्रित बल्क इंसर्ट API जो आपके इंसर्ट ऑपरेशंस को थोक में भेजकर सुव्यवस्थित करता है, और इससे भी बेहतर, यह आपको इस बारे में वास्तविक प्रतिक्रिया देता है कि क्या सफल हुआ और क्या विफल रहा।
निम्नलिखित बल्क इंसर्ट एपीआई ऑपरेशन newcollection
में सम्मिलित होगा वांछित डेटा संरचना जहां उत्पाद संग्रह कर्सर के भीतर नए दस्तावेज़ बनाए जाते हैं forEach()
लूप, ब्रैकेट नोटेशन
का उपयोग करके नए गुण बनाने के लिए। बल्क इंसर्ट में, आप 1000 के बैच में सर्वर को ऑपरेशन भेजेंगे जो आपको बेहतर प्रदर्शन देता है क्योंकि आप सर्वर को हर अनुरोध नहीं भेज रहे हैं, हर 1000 अनुरोधों में सिर्फ एक बार:
var bulk = db.newcollection.initializeUnorderedBulkOp(),
counter = 0;
db.products.find().forEach(function(doc) {
var document = {};
if (doc.mappingData.title) document["title"] = doc[doc.mappingData.title];
document["Manufacturer"] = doc.Manufacture;
bulk.insert(document);
counter++;
if (counter % 1000 == 0) {
bulk.execute();
bulk = db.newcollection.initializeUnorderedBulkOp();
}
});
if (counter % 1000 != 0) { bulk.execute(); }
उपरोक्त उदाहरण के साथ, आपको बल्क एपीआई ऑपरेशन से प्राप्त फीडबैक इस प्रारूप में होगा:
BulkWriteResult({
"writeErrors" : [ ],
"writeConcernErrors" : [ ],
"nInserted" : 2,
"nUpserted" : 0,
"nMatched" : 0,
"nModified" : 0,
"nRemoved" : 0,
"upserted" : [ ]
})
नया संग्रह क्वेरी करना db.newcollection.find()
उपज देगा:
/* 0 */
{
"_id" : ObjectId("56558b0427adb60c9f7e6f8d"),
"title" : "Toshiba Satellite Pro 4600 PIII800",
"Manufacturer" : "Toshiba"
}
/* 1 */
{
"_id" : ObjectId("56558b0427adb60c9f7e6f8e"),
"title" : "Apple Ihone",
"Manufacturer" : undefined
}