Наистина не мисля, че дори като захранваща заявка рамката за агрегиране е правилната операция за използване тук. Всичко, което правите, е "денормализиране" на масива като отделни документи. Наистина не би трябвало да има нужда. Вместо това просто извлечете документа:
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
за контролиране на цикъла. Съвпадението на елемента идва от позиционния $
оператор, съответстващ на съответстващия елемент на масива в заявката.
Това е просто JavaScript код, така че просто „превключете“ стойността с !invite.accepted
което ще го обърне. За допълнително забавление върнете масива „резултати“, като натиснете модифицирания документ от .findOneAndUpdate()
.