我必须从阵列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
任何建议如何在单行中插入剩余的两个忽略错误!
无序插入将成功(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 }
)
将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
。
注意:自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将失败。