假设您有一个应用,其中来自用户的一个单个操作涉及从不同集合中更新多个文档。
我实际上有两个问题; - )
执行此操作的最佳方式是什么,以及如何确保正确保存所有内容或取消操作?
我正在使用Mongoose
解决方案 A - 嵌套回调
假设userId和eventId都是由客户端POST调用或通过套接字提供的
User.findById(userId,{},function(err,myUser){
if(err){
console.log('Error updating user...');
return;
}
else{
Event.findById(eventId,{},function(err,myEvent){
if(err){
console.log('Error updating user's Event...');
return;
}else{
console.log('Both user and event were successfully updated');
socket.emit('Update success!') || res.send(...);
});
});
解决方案 B - 并行呼叫
User.findById(userId,{},function(err,myUser){
if(err){
console.log('Error updating user...');
return;
}
else{
console.log('Success updating user');
socket.emit('..') || res.send('...');
});
Event.findById(eventId,{},function(err,myEvent){
if(err){
console.log('Error updating user's Event...');
return;
}else{
console.log('Success updating Event');
socket.emit('Update success!') or res.send(...);
});
假设从一开始就知道userId和eventId,解决方案B似乎显然更快。无论如何,在这两种情况下,如果所有写入操作都成功,如何确保对数据库执行WRITE操作?
我必须这样做的事实意味着我的架构设计不合理,我应该合并信息吗?
感谢您的回复
答案 0 :(得分:1)
您可以使用BulkOperations并执行以下操作:
var bulk = db.items.initializeUnorderedBulkOp();
bulk.find( { status: "D" } ).update( { $set: { status: "I", points: "0" } } );
bulk.find( { item: null } ).update( { $set: { item: "TBD" } } );
bulk.execute();
参考:http://docs.mongodb.org/manual/reference/method/Bulk.find.update/
bulk.execute();将返回一个BulkWriteResult,其中包含批量操作的结果,在本例中为nModified文档:http://docs.mongodb.org/manual/reference/method/BulkWriteResult/#BulkWriteResult
但是,我认为自MongoDb 2.6发布以来无法从mongoose运行批量操作。