Mongoose(mongodb)批量插入,删除,更新和无操作

时间:2015-12-10 04:02:31

标签: node.js mongodb mongoose

大家好,我正在使用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数据库。如果任何对象失败,那么整个数组将回滚。任何想法或解决方案都将受到赞赏。

1 个答案:

答案 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 
});