我正在使用NodeJS和MongoDB和Express。 我需要将记录插入到必须包含电子邮件字段的集合中。 我正在使用insertMany函数来插入记录。插入唯一的电子邮件时,它可以正常工作,但是当输入重复的电子邮件时,操作会突然中断。
我尝试使用try catch打印错误消息,但插入重复的电子邮件后执行失败。我希望执行继续并存储重复项。我想获得插入/失败的记录的最终列表。
错误讯息:
Unhandled rejection MongoError: E11000 duplicate key error collection: testingdb.gamers index: email_1 dup key:
有没有办法处理错误,还是除了insertMany之外还有其他方法吗?
更新
电子邮件是我馆藏中的一个独特字段。
答案 0 :(得分:6)
如果您想继续插入所有非唯一文档而不是停在第一个错误上,请考虑将{ordered:false}
选项设置为insertMany()
,例如
db.collection.insertMany( [,, ...], { 有序的:假的 } )
根据the docs,无序操作将继续处理队列中的任何剩余写入操作,但仍会在BulkWriteError中显示错误。
答案 1 :(得分:0)
我无法发表评论,所以回答: 您是否使用唯一索引对此字段进行数据库收集,或者您的架构具有该字段的唯一属性?请分享有关您的代码的更多信息。
来自MongoDb docs:
“为属于唯一索引的任何键(例如_id)插入重复值会引发异常。以下尝试插入具有已存在的_id值的文档:”
try {
db.products.insertMany( [
{ _id: 13, item: "envelopes", qty: 60 },
{ _id: 13, item: "stamps", qty: 110 },
{ _id: 14, item: "packing tape", qty: 38 }
] );
} catch (e) {
print (e);
}
由于_id:13已存在,因此抛出以下异常:
BulkWriteError({
"writeErrors" : [
{
"index" : 0,
"code" : 11000,
"errmsg" : "E11000 duplicate key error collection: restaurant.test index: _id_ dup key: { : 13.0 }",
"op" : {
"_id" : 13,
"item" : "envelopes",
"qty" : 60
}
}
],
(some code omitted)
希望它有所帮助。
答案 2 :(得分:0)
由于您知道由于重复键插入而发生错误,因此您可以将初始对象数组分为两部分。一个具有唯一键,另一个具有重复键。这样,您就可以获得可以操作的重复项列表以及要插入的原始列表。
let a = [
{'email': 'dude@gmail.com', 'dude': 4},
{'email': 'dude@yahoo.com', 'dude': 2},
{'email': 'dude@hotmail.com', 'dude': 2},
{'email': 'dude@gmail.com', 'dude': 1}
];
let i = a.reduce((i, j) => {
i.original.map(o => o.email).indexOf(j.email) == -1? i.original.push(j): i.duplicates.push(j);
return i;
}, {'original': [], 'duplicates': []});
console.log(i);
编辑:我刚刚意识到,如果密钥已存在于数据库中,这将不起作用。所以你可能不应该使用这个答案。但我会把它留在这里作为其他人的参考,他们可能会按照同样的思路思考。 Nic Cottrell's回答是对的。