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

问题描述 投票:4回答:3

我必须从阵列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

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

node.js mongodb mongoose
3个回答
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
投票

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


0
投票

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

下面的响应保持原样(因为ensure现在是create的别名 - 两者都可以在当前工作),但是对于较新的版本,你应该用db.products.ensureIndex替换db.products.createIndex


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

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

然后插入

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.