Saya benar-benar tidak berpikir bahwa bahkan sebagai kueri pengumpan, kerangka kerja agregasi adalah operasi yang tepat untuk digunakan di sini. Yang Anda lakukan hanyalah "mendenormalisasi" array sebagai dokumen individual. Benar-benar tidak perlu. Ambil saja dokumennya:
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);
});
});
Jadi tidak ada masalah mengulangi daftar dokumen sebagai tanggapan atas apa yang Anda lakukan, hanya saja Anda juga ingin mengulangi anggota array juga. Tangkapannya adalah ketika mengeluarkan segala jenis .update()
yang perlu Anda ketahui maka panggilan asinkron selesai.
Jadi saya menggunakan async.each
tetapi Anda mungkin ingin async.eachLimit
untuk mengontrol perulangan. Pencocokan elemen berasal dari posisi $
operator, sesuai dengan elemen larik yang cocok dalam kueri.
Ini hanya kode JavaScript, jadi cukup "alihkan" nilainya dengan !invite.accepted
yang akan membalikkannya. Untuk kesenangan tambahan, kembalikan larik "hasil" dengan mendorong dokumen yang dimodifikasi dari .findOneAndUpdate()
.