Mongoose的'findOneAndUpdate和upsert

时间:2017-09-23 10:18:19

标签: javascript mongodb asynchronous mongoose upsert

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

更多地解释行为:

  1. 当csv文件包含在运行我的脚本之前已经存储在MongoDB中的电子邮件地址时,findOneAndUpdate可以正常运行
  2. 但是,当我在csv文件中有两个共享相同电子邮件地址的记录但在运行脚本之前没有将此电子邮件地址的记录存储在MongoDB中时,我有时会得到一个重复的密钥错误,如{{1} }
  3. 我上面写了有时因为有时候(尽管不那么常常)我没有,而且一切都按原样运作。
  4. 代码:

    { MongoError: E11000 duplicate key error collection: db.accounts index: email_1 dup key: { : "xxxxx@yahoo.com" }

    提前感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

This post表明搜索和保存不存在的文档不是原子的,这意味着在搜索和保存之间,另一个查询可能已经为相同的搜索条件产生了未找到的结果。似乎唯一的解决方案是确保处理重复的密钥错误,例如,通过将MongoDB操作重新应用到被抛出的文档。

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