मैं वास्तव में नहीं सोचता कि एक फीडर क्वेरी के रूप में भी एकत्रीकरण ढांचा यहां उपयोग करने के लिए सही संचालन है। आप जो कुछ भी कर रहे हैं वह सरणी को अलग-अलग दस्तावेज़ों के रूप में "असामान्यीकृत" कर रहा है। वास्तव में कोई आवश्यकता नहीं होनी चाहिए। इसके बजाय बस दस्तावेज़ प्राप्त करें:
var query = {}; // whatever criteria
Users.find(query,"Invitation",function(err,docs) {
if (err) {
console.log(err);
var results = [];
async.each(docs,function(doc,callback) {
async.each(docs.Invitation,function(invite,callback) {
Users.findOneAndUpdate(
{ "_id": doc._id, "Invitation._id": invite._id },
{ "$set": { "Invitation.$.Accepted": !invite.Accepted } },
function(err,doc) {
results.push( doc );
callback(err);
}
);
},callback);
},function(err) {
if (err)
console.log(err);
console.log(results);
});
});
तो आप जो कर रहे हैं उसके जवाब में दस्तावेज़ों की सूची को फिर से शुरू करने में कोई समस्या नहीं है, यह सिर्फ इतना है कि आप सरणी सदस्यों को भी पुन:सक्रिय करना चाहते हैं। किसी भी प्रकार का .update()
. जारी करते समय पकड़ में आता है कि आपको जागरूक होने की आवश्यकता है तो एसिंक्रोनस कॉल पूर्ण हो गया है।
इसलिए मैं async.each
का उपयोग कर रहा हूं लेकिन आप शायद async.eachLimit
चाहते हैं लूपिंग को नियंत्रित करने के लिए। तत्व का मिलान स्थितिगत $
ऑपरेटर, क्वेरी में मिलान किए गए सरणी तत्व के अनुरूप।
यह सिर्फ जावास्क्रिप्ट कोड है, इसलिए बस !invite.accepted
के साथ मान को "टॉगल" करें जो इसे उलट देगा। अतिरिक्त मनोरंजन के लिए, संशोधित दस्तावेज़ को से पुश करके "परिणाम" सरणी लौटाएं .findOneAndUpdate()
।