猫鼬的findOneAndUpdate和upsert中的重复键错误

晶圆厂

当来自我的csv文件的输入包含具有相同电子邮件地址的两行或更多行时,我遇到了findOneAndUpdate问题。电子邮件地址在我的模型中设置为唯一,我认为findOneAndUpdate可以让我处理csv文件中的重复项。代码如下。在此处阅读,这是因为查询中的字段(在本例中为电子邮件)也是我要创建的字段之一(以防找不到记录)。我不确定这是否是真的。无论如何,电子邮件是我的标识符,因此必须在其中。

要进一步解释该行为:

  1. 当csv文件包含在我运行脚本之前已经存储在MongoDB中的电子邮件地址时,findOneAndUpdate可以正常工作
  2. 但是,当我在csv文件中有两条记录共享相同的电子邮件地址,但是在运行脚本之前,此电子邮件地址的记录未存储在MongoDB中时,有时会出现重复的键错误,如下所示 { MongoError: E11000 duplicate key error collection: db.accounts index: email_1 dup key: { : "[email protected]" }
  3. 有时在上面写文章因为有时(虽然不那么频繁)我不这样做,并且一切正常。

代码:

for (let i = 0; i < accounts.length; i++) {
   let query = {'email': accounts[i].email};
   let accountHolderDoc = {
       email: accounts[i].email,
       name: {
         first: accounts[i].accountHolderFName,
         last: accounts[i].accountHolderLName,
       },
    };

    promise = AccountHolder
        .findOneAndUpdate(
            query, {$set: accountHolderDoc}, {upsert: true, new: true})
        .then(function(accountHolder) { ... })
        .catch( ... );
   ...
}

在此先感谢您的帮助!

晶圆厂

这篇文章表明,搜索和保存不存在的文档不是原子的,这意味着在搜索和保存之间,对于相同的搜索条件,另一个查询可能会产生未找到的结果。看来,唯一的解决方案是确保是否处理重复的键错误,例如,通过将MongoDB操作重新应用于抛出的文档来确保。

我现在将遵循此解决方案。如果有人有不同的处理方法,请告诉我。谢谢!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章