जैसा कि उल्लेख किया गया है, यहां मुख्य मुद्दा स्थितीय ऑपरेटर के साथ कई तत्वों पर अपडेट के साथ है जैसा कि इस लंबे समय तक चलने वाले मुद्दे में दर्ज किया गया है:http://jira.mongodb.org/browse/SERVER-1243
इसलिए मूल मामला यह है कि कोई एकल निष्पादन ऐसा नहीं कर सकता है, इसलिए कई सरणी तत्वों के लिए प्रक्रिया करने के लिए आपको यह निर्धारित करने की कुछ विधि की आवश्यकता है कि आपको प्रत्येक तत्व के लिए एक अपडेट स्टेटमेंट को अपडेट करने और संसाधित करने के लिए कितने तत्वों की आवश्यकता है।
इसके लिए एक सरल तरीका आम तौर पर बल्क ऑपरेशंस का उपयोग करना है। सर्वर के लिए एकल अनुरोध और प्रतिक्रिया के रूप में "मल्टीपल" अपडेट ऑपरेशंस को संसाधित करने के लिए:
var bulk = db.collection.initializeOrderedBulkOp(),
count = 0;
db.collection.find({ "name": "John Doe", "adds.status": "PENDING" }).forEach(function(doc) {
doc.adds.filter(function(add){ return add.status = "PENDING" }).forEach(function(add) {
bulk.find({ "_id": doc._id, "adds.status": "PENDING" }).updateOne({
"$set": { "adds.$.status": "APPROVED" }
});
count++;
// Execute once in 1000 statements created and re-init
if ( count % 1000 == 0 ) {
bulk.execute();
bulk = db.collection.initializeOrderedBulkOp();
}
});
});
// Execute any pending operations
if ( count % 1000 != 0 )
bulk.execute();
यदि आपके अपडेट किए गए दस्तावेज़ काफी छोटे हैं, या वास्तव में केवल एक ही दस्तावेज़ है तो आप count
. को छोड़ सकते हैं आवश्यक लूप में सभी बल्क अपडेट की जांच करें और उन्हें सरलता से संलग्न करें और सभी लूपों के अंत में बस एक बार निष्पादित करें।
एक लंबी व्याख्या और विकल्प एकाधिक सरणी तत्वों को कैसे अपडेट करें
पर पाए जा सकते हैं। , लेकिन सभी एक स्थितीय $
मिलान किए गए प्रत्येक दस्तावेज़ के लिए या जब तक कोई और संशोधित दस्तावेज़ वापस नहीं किया जाता है, तब तक कई बार अपडेट करें।