हालांकि मुझे नहीं लगता कि एक अपेक्षित गिनती पर पुनरावृत्ति करना ऐसा करने का "सर्वश्रेष्ठ" तरीका है, यहां मूल रूप से नोड द्वारा कुछ मदद के साथ आप जो करने की कोशिश कर रहे हैं, उसमें सुधार है async
प्रवाह नियंत्रण के लिए पुस्तकालय:
async.waterfall(
[
function(callback) {
collection.aggregate(
[
{ "$match": { "_id": ObjectId("4d2d8deff4e6c1d71fc29a07") } },
{ "$unwind": "$events" },
{ "$match": { "events.handled.visibile": false } },
{ "$group": {
"_id": "$_id",
"count": { "$sum": 1 }
}}
],
callback
);
},
function(results,callback) {
console.log(results);
var result = results[0];
async.whilst(
function() { return result.count-- },
function(callback) {
collection.update(
{ "_id": result._id, "events.handled.visibile": false },
{ "$set": { "events.$.handled.visibile": true } },
callback
)
},
callback
);
}
],
function(err) {
if (err) throw err;
// finished now
}
);
तो यहाँ मुख्य बातें यह हैं कि आपका .update()
इसके बजाय कथन को "events.handled.visibile": false
. की तलाश में होना चाहिए मेल खाता है, और निश्चित रूप से आपको यह सुनिश्चित करने की आवश्यकता है कि संचालन "श्रृंखला में" निष्पादित होता है, अन्यथा कोई वास्तविक गारंटी नहीं है कि आप वास्तव में पिछले .update()
से बदली हुई स्थिति में दस्तावेज़ को हथिया रहे हैं। ।
async.whilst
प्रवाह नियंत्रण को संभालता है ताकि यह प्रत्येक के पूरा होने की प्रतीक्षा कर सके .update()
अगले क्रियान्वित होने तक। जब यह पहला तार्किक कथन होता है true
(काउंटर समाप्त) और सभी .update()
बयान चलाए जाते हैं तो लूप अंतिम कॉलबैक के लिए जारी होगा।
जहां संभव हो, आपको वास्तव में जिस उत्तर का आप अनुसरण कर रहे हैं में संदर्भित "बल्क" अपडेट ऑपरेशन का उपयोग करना चाहिए। ए> . यह सभी अपडेट भेजता है और एक बार और केवल एक प्रतिक्रिया होती है, इसलिए प्रत्येक ऑपरेशन के पूरा होने की प्रतीक्षा करने का ओवरहेड समाप्त हो जाता है।