Mongodb多文档插入忽略自定义重复字段错误

时间:2015-12-08 10:06:27

标签: node.js mongodb mongoose

我必须从数组1插入3个记录集已经存在,2个是新的

e.g:

db.products.insert(
   [
     { imagename: "pen1", qty: 21 },
     { imagename: "pen", qty: 20 },
     { imagename: "eraser", qty: 25 }
   ]
)

其中“{imagename:”pen“,qty:20}”`已经存在且具有唯一键  在mongodb的字段“imagename”

现在没有人插入和投掷 错误:'E11000重复键错误索引:mongotest.mothership。$ imagename_1 dup

任何建议如何在单行中插入剩余的两个忽略错误!

3 个答案:

答案 0 :(得分:9)

无序插入可以解决问题(https://docs.mongodb.org/v3.0/reference/method/db.collection.insert/#perform-an-unordered-insert

db.products.insert(
    [{ imagename: "pen1", qty: 21 },
     { imagename: "pen", qty: 20 },
     { imagename: "eraser", qty: 25 }],
    { ordered: false }
)

答案 1 :(得分:1)

ordered选项设置为false。这不是一个技巧,而是一个稳定的方法来实现它。如果发生错误,您可以获得有关每个错误的信息。

const documents = [{name: "Star Wars"}, {name: "Sword Art Online"}];
db.product.insertMany(documents, {ordered: false});

如果您使用 Mongoose ,请使用Model.insertMany()

  

Perform an Unordered Insert

     

以下示例执行三个无序插入   文档。 使用无序插入,如果插入期间发生错误   其中一个文件,MongoDB继续插入其余文件   数组中的文档。

  

错误处理

     

插入会抛出BulkWriteError例外。

     

排除 Write Concern 错误,有序操作在发生错误后停止,而无序操作继续处理队列中任何剩余的写入操作。

  

db.collection.insertMany()

     

将多个文档插入到集合中。

db.collection.insertMany(
   [ <document 1> , <document 2>, ... ],
   {
      writeConcern: <document>,
      ordered: <boolean>
   }
)
     

ordered :可选。一个布尔值,指定mongod实例是否应执行有序或无序插入。默认为true

答案 2 :(得分:0)

注意:自v3.0.0以来不推荐使用ensureIndex https://docs.mongodb.com/manual/reference/method/db.collection.ensureIndex/

以下回复保留原样(因为ensure现在是create的别名 - 两者目前都有效),但对于较新版本,您应将db.products.ensureIndex替换为{ {1}}。

首先需要创建唯一索引。 例如:

db.products.createIndex

然后插入

db.products.ensureIndex({ url: 1 }, { unique: true, background: true, dropDups: true })

会发生错误:E11000重复密钥错误集合:mongotest.products index:imagename_1 dup key:{:'pen'}。 没关系。 你可以试试...... catche

db.products.insert(
    [{ imagename: "pen", qty: 21 },
     { imagename: "pen", qty: 20 },
     { imagename: "eraser", qty: 25 }],
    { ordered: false }
)

注意:当你调用ensureIndex时,你不能调用insert.bec因为ensureIndex是异步的,或者ensureIndex会失败。