首页 文章

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

提问于
浏览
0

Hi all ,我正在使用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 - update,tag = 3 - delete

现在我想通过 one shot into mongodb database save 这个数组 . 如果任何对象失败,那么整个数组将回滚 . 任何想法或解决方案将是欣赏 .

1 回答

  • 0

    你想要的是一个'交易',但mongodb不支持它 . mongodb中的文档以原子方式更新 - 您无法从批量插入/更新/删除回滚 . 您最好重新考虑数据库设计 .

    您还可以实现"transaction-like"方法,如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 
    });
    

相关问题