Mongodb, Node - 同步更新多个对象
Mongodb, Node - Updating multiple objects synchronously
使用 Mongodb、Nodejs、Async.js 和 Express.js
我正在尝试同时更新多个文档,其中每个文档都有自己的更新。我想等待所有文档更新,以便我可以通知用户所有文档都已更新。
我现在遇到的问题是我的回调函数没有触发,或者如果触发了,那么什么也没有发生。这是我的进度:
db.client.collection('page').find({page_id: page_id}).toArray(function(page_err, document_page) {
if(page_err) {
throw page_err;
} else if(document_page === '' || document_page === undefined || document_page === null) {
throw page_err;
} else {
var count = 0;
async.each(data, function iteratee(i, callback) {
var item_id = (i.item_id === '') ? new ObjectId() : new ObjectId(i.item_id);
var query = {item_id: item_id};
var update = {
_id : new ObjectId(),
page_id : page_id,
section_id : null,
item_id : item_id,
created : new Date().toISOString(),
item_type : "dish",
item: {
title: i.title,
description: i.description,
price: i.price,
star: false,
double_star: false
},
last_modified: new Date().toISOString()
};
var options = { upsert: true };
db.client.collection('item').updateOne(query, {$set: update}, options, function(item_err, results) {
if(item_err) {
res.sendStatus(500);
} else if(results === '' || results === undefined || results === null) {
res.sendStatus(400);
} else {
++count;
if(count === data.length) {
callback();
return;
}
}
});
}, function() {
console.log('sending 200 status');
res.sendStatus(200);
});
}
});
当我 运行 代码时,我确实输入了调用 callback() 的 if 语句。我已经坚持了几个小时,但无法正常工作。如果您需要更多信息,我很乐意提供。为了简单起见,我删除了许多 console.logs 以避免混乱。
所有迭代都需要触发回调,否则它将无限期挂起。 callback
必须在每次迭代中调用。总是。
如果遇到错误,需要调用callback(error)
。您将遇到的问题是 async.each 预先安排所有迭代,因此 iteratee
将触发 data.length
次,无论是否在执行中途遇到错误。如果您需要 运行 串联它们,您可以使用 async.eachSeries
这将花费更多时间但可以让您更好地控制并且无需回滚。
所以代码看起来像这样:
db.client.collection('page').find({page_id: page_id}).toArray(function(page_err, document_page) {
if(page_err) {
throw page_err;
} else if(document_page === '' || document_page === undefined || document_page === null) {
throw page_err;
} else {
async.each(data, function iteratee(i, callback) {
var item_id = (i.item_id === '') ? new ObjectId() : new ObjectId(i.item_id);
var query = {item_id: item_id};
var update = {
_id : new ObjectId(),
page_id : page_id,
section_id : null,
item_id : item_id,
created : new Date().toISOString(),
item_type : "dish",
item: {
title: i.title,
description: i.description,
price: i.price,
star: false,
double_star: false
},
last_modified: new Date().toISOString()
};
var options = { upsert: true };
db.client.collection('item').updateOne(query, {$set: update}, options, function(item_err, results) {
if(item_err) {
callback(500);
} else if(results === '' || results === undefined || results === null) {
callback(400)
} else {
callback();
}
});
}, function(err) {
// Passing the status code only for the example.
// `err` should be an object with more metadata probably
if(err) {
res.sendStatus(err);
return;
}
console.log('sending 200 status');
res.sendStatus(200);
});
}
});
使用 Mongodb、Nodejs、Async.js 和 Express.js
我正在尝试同时更新多个文档,其中每个文档都有自己的更新。我想等待所有文档更新,以便我可以通知用户所有文档都已更新。
我现在遇到的问题是我的回调函数没有触发,或者如果触发了,那么什么也没有发生。这是我的进度:
db.client.collection('page').find({page_id: page_id}).toArray(function(page_err, document_page) {
if(page_err) {
throw page_err;
} else if(document_page === '' || document_page === undefined || document_page === null) {
throw page_err;
} else {
var count = 0;
async.each(data, function iteratee(i, callback) {
var item_id = (i.item_id === '') ? new ObjectId() : new ObjectId(i.item_id);
var query = {item_id: item_id};
var update = {
_id : new ObjectId(),
page_id : page_id,
section_id : null,
item_id : item_id,
created : new Date().toISOString(),
item_type : "dish",
item: {
title: i.title,
description: i.description,
price: i.price,
star: false,
double_star: false
},
last_modified: new Date().toISOString()
};
var options = { upsert: true };
db.client.collection('item').updateOne(query, {$set: update}, options, function(item_err, results) {
if(item_err) {
res.sendStatus(500);
} else if(results === '' || results === undefined || results === null) {
res.sendStatus(400);
} else {
++count;
if(count === data.length) {
callback();
return;
}
}
});
}, function() {
console.log('sending 200 status');
res.sendStatus(200);
});
}
});
当我 运行 代码时,我确实输入了调用 callback() 的 if 语句。我已经坚持了几个小时,但无法正常工作。如果您需要更多信息,我很乐意提供。为了简单起见,我删除了许多 console.logs 以避免混乱。
所有迭代都需要触发回调,否则它将无限期挂起。 callback
必须在每次迭代中调用。总是。
如果遇到错误,需要调用callback(error)
。您将遇到的问题是 async.each 预先安排所有迭代,因此 iteratee
将触发 data.length
次,无论是否在执行中途遇到错误。如果您需要 运行 串联它们,您可以使用 async.eachSeries
这将花费更多时间但可以让您更好地控制并且无需回滚。
所以代码看起来像这样:
db.client.collection('page').find({page_id: page_id}).toArray(function(page_err, document_page) {
if(page_err) {
throw page_err;
} else if(document_page === '' || document_page === undefined || document_page === null) {
throw page_err;
} else {
async.each(data, function iteratee(i, callback) {
var item_id = (i.item_id === '') ? new ObjectId() : new ObjectId(i.item_id);
var query = {item_id: item_id};
var update = {
_id : new ObjectId(),
page_id : page_id,
section_id : null,
item_id : item_id,
created : new Date().toISOString(),
item_type : "dish",
item: {
title: i.title,
description: i.description,
price: i.price,
star: false,
double_star: false
},
last_modified: new Date().toISOString()
};
var options = { upsert: true };
db.client.collection('item').updateOne(query, {$set: update}, options, function(item_err, results) {
if(item_err) {
callback(500);
} else if(results === '' || results === undefined || results === null) {
callback(400)
} else {
callback();
}
});
}, function(err) {
// Passing the status code only for the example.
// `err` should be an object with more metadata probably
if(err) {
res.sendStatus(err);
return;
}
console.log('sending 200 status');
res.sendStatus(200);
});
}
});