Тук има няколко грешни неща в кода ви. Първо и най-важното, което трябва да отбележите, е, че сега работите в "асинхронна" среда и трябва да промените мисленето си за това как правите някои неща.
Вашият предишен PHP код е „блокиращ“, което означава, че всеки ред от код трябва да бъде завършен, преди да преминете към следващия ред от код. Това включва изчакване сървър на база данни да извърши актуализация и да върне отговора.
Не можете да използвате основни контролни цикли с функции вътре в тях, които се изпълняват асинхронно. Вместо това имате нужда от нещо, което може да извика следващата итерация на цикъла (или поне да сигнализира, че една итерация е завършена), след като асинхронната функция "update" действително е върнала резултат.
Втората точка тук е, че „нищо не е актуализирано“, защото не сте указали на функцията какво да актуализира или с какво да актуализира съответстващия документ.
Следното е аналогично на вашия оригинален PHP списък, но коригирано за "async" методи също използва async.eachSeries
за контрол на цикъла от async
библиотека:
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()
командата вместо това връща документа, който е бил модифициран и с модификациите само ако ги поискате с { "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
}
);
Ако искате да добавите няколко елемента от масив наведнъж или ако имате дори един елемент директно в масив, тогава използвайте $each
модификатор на $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
}
);