Có một số điều sai trong mã của bạn ở đây. Đầu tiên và quan trọng nhất cần lưu ý là bạn đang chạy trong môi trường "không đồng bộ" và bạn cần thay đổi suy nghĩ về cách bạn thực hiện một số việc.
Mã PHP trước đó của bạn đang "chặn", có nghĩa là mọi dòng mã phải hoàn thành trước khi chuyển sang dòng mã tiếp theo. Điều này bao gồm việc đợi máy chủ cơ sở dữ liệu thực hiện cập nhật và trả lại phản hồi.
Bạn không thể sử dụng các vòng điều khiển cơ bản với các chức năng bên trong chúng hoạt động không đồng bộ. Thay vào đó, bạn cần một cái gì đó có thể gọi lần lặp tiếp theo của vòng lặp (hoặc ít nhất là báo hiệu rằng một lần lặp duy nhất đã hoàn tất) sau khi hàm không đồng bộ "update" thực sự trả về một kết quả.
Điểm thứ hai ở đây là "không có gì được cập nhật" bởi vì bạn không cho chức năng biết những gì cần cập nhật hoặc những gì để cập nhật tài liệu phù hợp.
Danh sách sau đây tương tự với danh sách PHP gốc của bạn, nhưng được điều chỉnh cho các phương thức "async" cũng sử dụng async.eachSeries
để kiểm soát vòng lặp từ async
thư viện:
async.eachSeries(
tables,
function(table,callback) {
var tablename = table.tablename;
delete table.tablename; // just remove the key rather than re-construct
OutAccept.update(
{ "tablename": tablename },
{ "$push": { "inventar": table } },
function(err,numAffected) {
console.log( numAfftected ); // tells you how many are updated or nothing
callback(err)
}
);
},
function(err) {
// comes here on completion of all array items
}
);
.findOneAndUpdate()
thay vào đó, lệnh trả về tài liệu đã được sửa đổi và chỉ với các sửa đổi nếu bạn yêu cầu chúng bằng { "new": true }
async.eachSeries(
tables,
function(table,callback) {
var tablename = table.tablename;
delete table.tablename;
OutAccept.findOneAndUpdate(
{ "tablename": tablename },
{ "$push": { "inventar": table } },
{ "new": true },
function(err,doc) {
console.log( doc ); // shows the modified document
callback(err)
}
);
},
function(err) {
// comes here on completion of all array items
}
);
Nếu bạn muốn thêm nhiều phần tử mảng cùng một lúc hoặc nếu bạn có ngay cả một phần tử duy nhất trực tiếp trong một mảng thì hãy sử dụng $each
sửa đổi thành $push
:
var inventor = [
{
"ean": "2",
"name": "name2",
"runtime": "0",
"art": "null",
"marker": "null",
"stammkost": "null",
"accepted": "0"
},
{
"ean": "1",
"name": "name1",
"runtime": "0",
"art": "null",
"marker": "null",
"stammkost": "null",
"accepted": "0"
}
];
OutAccept.update(
{ "tablename": tablename },
{ "$push": { "inventar": { "$each": inventar } } },
function(err,numAffected) {
// work in here
}
);