Tôi thực sự không nghĩ rằng ngay cả khi là một truy vấn bộ nạp, khung tổng hợp là hoạt động phù hợp để sử dụng ở đây. Tất cả những gì bạn đang làm là "không chuẩn hóa" mảng dưới dạng các tài liệu riêng lẻ. Thực sự không cần thiết. Thay vào đó, chỉ cần tìm nạp tài liệu:
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);
});
});
Vì vậy, không có vấn đề gì khi lặp lại danh sách tài liệu trong một phản hồi cho những gì bạn đang làm, chỉ là bạn cũng muốn lặp lại các thành viên của mảng. Điều bắt buộc là khi phát hành bất kỳ loại .update ()
nào mà bạn cần biết thì cuộc gọi không đồng bộ sẽ hoàn tất.
Vì vậy, tôi đang sử dụng async.each
nhưng bạn có thể muốn async.eachLimit
để kiểm soát vòng lặp. Sự phù hợp của phần tử đến từ mã vị trí $
, tương ứng với phần tử mảng phù hợp trong truy vấn.
Nó chỉ là mã JavaScript, vì vậy chỉ cần "chuyển đổi" giá trị bằng ! Mời.accepted
mà sẽ đảo ngược nó. Để thêm phần thú vị, hãy trả lại mảng "kết quả" bằng cách đẩy tài liệu đã sửa đổi từ .findOneAndUpdate ()
.