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

Posted

技术标签:

【中文标题】Mongoose (mongodb) 批量插入、删除、更新和无操作【英文标题】:Mongoose (mongodb) batch insert, delete, update and no operation 【发布时间】:2016-03-15 14:12:26 【问题描述】:

大家好,我正在使用 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 数据库。如果任何对象失败,则整个数组将回滚。任何想法或解决方案将不胜感激。

【问题讨论】:

你看过这个链接docs.mongodb.org/manual/faq/fundamentals/…来自***.com/questions/21487233/… @DaveCoast,好的,但是有其他方法吗? @DaveCoast,我想改变我的数据库,你能告诉我哪个 nosql 数据库最适合我吗? 大多数 nosql 数据库不支持事务。如果它对您很重要,您应该使用 SQL。 我在下面添加了一些示例代码。您可以使用该插件在您的情况下执行事务。如果您不太关心性能,也许它对您有用。 【参考方案1】:

你想要的是一个“事务”,但 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 
);

【讨论】:

以上是关于Mongoose (mongodb) 批量插入、删除、更新和无操作的主要内容,如果未能解决你的问题,请参考以下文章

使用 mongoose 在 MongoDB 中批量插入多个集合

Mongoose 批量插入子类别

mongoose 批量操作

Mongoose:批量更新插入,但仅在满足某些条件时才更新记录

猫鼬批量插入错误

有啥方法可以使用 mongoose 从 mongodb 批量操作中获取修改后的 IDS?