大家好,我正在使用mongodb版本“mongodb-win32-x86_64-2008plus-ssl-3.0.7-signed
”和中间人mongoose版本“4.2.5
”尝试批量插入,删除和更新。我已经搜索了几天,但没有发现任何答案是明确的。
我有一个下面的数组列表,数组列表有四个具有不同标记级别的对象。
var mangoobjectList = [
{ id: 1, name: 'Gopal Vog', origin: 'Rajshahi', tag: 0 },//no change
{ id: 2, name: 'Himsagor', origin: 'Dhaka', tag: 1 },//insert
{ id: 3, name: 'Langra', origin: 'Sylet', tag: 2 },//update
{ id: 4, name: 'Amrupali', origin: 'Chuadanga', tag: 3 }//delete
];
我的意思是说tag = 0 --no operation,tag = 1 - inset tag = 2 - 更新,标签= 3 - 删除
现在我希望保存此数组一次性进入mongodb数据库。如果任何对象失败,那么整个数组将回滚。任何想法或解决方案都将受到赞赏。
答案 0 :(得分:0)
你想要的是'交易',但是mongodb不支持它。 mongodb中的文档以原子方式更新 - 您无法从批量插入/更新/删除回滚。您最好重新考虑数据库设计。
您还可以实现mongodb文档中描述的“类似事务”方法: https://docs.mongodb.org/manual/tutorial/perform-two-phase-commits/
此外,您可以使用mongoose插件 - 可能是最简单的选项: https://www.npmjs.com/package/mongoose-transaction
var mongoose = require('mongoose');
var Transaction = require('mongoose-transaction')(mongoose);
var mangoobjectList = [
{ id: 1, name: 'Gopal Vog', origin: 'Rajshahi', tag: 0 },//no change
{ id: 2, name: 'Himsagor', origin: 'Dhaka', tag: 1 },//insert
{ id: 3, name: 'Langra', origin: 'Sylet', tag: 2 },//update
{ id: 4, name: 'Amrupali', origin: 'Chuadanga', tag: 3 }//delete
];
var transaction = new Transaction();
mangoobjectList.forEach(function(doc){
switch(doc.tag) {
case 1:
transaction.insert('collectionName', doc);
break;
case 2:
transaction.update('collectionName', doc._id, doc);
break;
case 3:
transaction.remove('collectionName', doc._id);
break;
default:
//do nothing
}
});
transaction.run(function(err, docs){
// your code here
});