Ik denk echt niet dat zelfs als een feeder-query het aggregatieraamwerk de juiste bewerking is om hier te gebruiken. Het enige dat u doet, is de array "denormaliseren" als afzonderlijke documenten. Zou eigenlijk niet nodig moeten zijn. Haal gewoon het document op:
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);
});
});
Het is dus geen probleem om de lijst met documenten te herhalen in een reactie op wat u aan het doen bent, het is alleen dat u ook de arrayleden wilt herhalen. De vangst is bij het uitgeven van een soort .update()
dat u moet weten, dan is de asynchrone oproep voltooid.
Dus ik gebruik async.each
maar je wilt waarschijnlijk async.eachLimit
om de loop te regelen. De matching van het element komt van de positionele $
operator, die overeenkomt met het overeenkomende array-element in de query.
Het is gewoon JavaScript-code, dus "wissel" de waarde gewoon met !invite.accepted
die het zal omkeren. Retourneer voor nog meer plezier de array "results" door het gewijzigde document van .findOneAndUpdate()
.