【问题标题】:Insert documents into collection unless they are already inserted?除非它们已经插入,否则将文档插入集合中?
【发布时间】:2019-04-14 01:01:48
【问题描述】:

我从 API 中获取对象列表:

let sold = [
 {  objId: 3240747,
    soldDate: '2018-09-27',
    soldPrice: 4610000,
    apartmentNumber: '1202',
    soldPriceSource: 'bid',
  },
  { objId: 3234263,
    soldDate: '2018-09-24',
    soldPrice: 2580000,
    soldPriceSource: 'bid',
  }
...
]

我将这些存储在一个集合中:

soldCollection.insertMany(sold)

之前已经检索过一些对象,我只想存储一次尚未在数据库中的对象。

 dbo.collection("sold").createIndex({ "objId": 1 }, { unique: true })

这样做的有效方法是什么?我应该在存储之前询问每个对象还是有处理方法?

【问题讨论】:

  • 您可以直接插入到数据库中,因为您要添加 unique 键。如果已经存在,MongoDB 将不会插入。如果你想在已经存在的情况下做一些额外的事情,请检查错误,否则忽略错误。
  • 如果我没记错的话,insertMany 中有一个关于如何处理错误的选项,如停止或忽略

标签: javascript node.js mongodb ecmascript-6


【解决方案1】:

默认情况下,insertMany 将在第一个错误发生时停止插入(在这种情况下为E11000 duplicate key error)。您可以通过将ordered 参数设置为false 来更改该行为。在这种情况下,您将获得插入失败的错误列表,但所有有效文档都将成功插入:

db.sold.insertMany(sold, { ordered: false })

文档示例here

【讨论】:

  • 酷,我什至没有注意到它的工作原理。有没有办法禁用这个特定的错误?无论是对于一般的这种操作。
  • 不幸的是,MongoDB 中没有INSERT IF NOT EXISTS,但是对于无序,我认为这更像是一个警告而不是错误,它只通知您某些插入失败,但是整个“批处理”已成功处理跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-28
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 1970-01-01
相关资源
最近更新 更多