我必须从数组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
任何建议如何在单行中插入剩余的两个忽略错误!
答案 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会失败。