使用Mongo NodeJS中的bulkinsert处理错误

时间:2017-10-04 07:31:01

标签: node.js mongodb

我正在使用NodeJS和MongoDB和Express。 我需要将记录插入到必须包含电子邮件字段的集合中。 我正在使用insertMany函数来插入记录。插入唯一的电子邮件时,它可以正常工作,但是当输入重复的电子邮件时,操作会突然中断。

我尝试使用try catch打印错误消息,但插入重复的电子邮件后执行失败。我希望执行继续并存储重复项。我想获得插入/失败的记录的最终列表。

错误讯息:

Unhandled rejection MongoError: E11000 duplicate key error collection: testingdb.gamers index: email_1 dup key: 

有没有办法处理错误,还是除了insertMany之外还有其他方法吗?

更新

电子邮件是我馆藏中的一个独特字段。

3 个答案:

答案 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回答是对的。