Ich glaube wirklich nicht, dass das Aggregations-Framework selbst als Feeder-Abfrage die richtige Operation ist, um es hier zu verwenden. Alles, was Sie tun, ist das Array als einzelne Dokumente zu "denormalisieren". Sollte eigentlich nicht nötig sein. Holen Sie stattdessen einfach das Dokument:
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);
});
});
Es ist also kein Problem, die Liste der Dokumente in einer Antwort für das, was Sie tun, zu iterieren, es ist nur so, dass Sie auch die Array-Mitglieder iterieren möchten. Der Haken ist, wenn Sie irgendeine Art von .update()
ausgeben dass Sie sich bewusst sein müssen, dass der asynchrone Aufruf abgeschlossen ist.
Also verwende ich async.each
aber Sie möchten wahrscheinlich async.eachLimit
um die Schleife zu steuern. Die Übereinstimmung des Elements ergibt sich aus dem positionsbezogenen $
-Operator, der dem übereinstimmenden Array-Element in der Abfrage entspricht.
Es ist nur JavaScript-Code, also „schalten“ Sie einfach den Wert mit !invite.accepted
um was es umkehren wird. Geben Sie für zusätzlichen Spaß das Array „results“ zurück, indem Sie das geänderte Dokument von .findOneAndUpdate()
.