【问题标题】:MongoDB unique index errors: how to know which field generated the error?MongoDB唯一索引错误:如何知道哪个字段产生了错误?
【发布时间】:2011-12-12 16:56:00
【问题描述】:

更新:这个问题是针对 MongoDB 1.8.x 提出的,并且接受的解决方案与 1.8 有关。但是请注意,Mongo 2.x 已对错误消息进行了更改,以便您可以分辨哪些字段在更新和插入时产生错误(请参阅下面来自 Kyle 和 Remon 的 cmets)。 p>

有没有办法尝试 Mongo upsert,如果存在唯一索引违规,知道是哪个字段导致问题 - 全部在一个数据库操作中?

例如,假设我有一个带有 _idname 属性的 customers 集合。另外,假设name 存在一个unique index,以确保没有两个customer 文档拥有相同的name

目前,我执行 两个 数据库操作来执行 upsert:

  1. 查询 customers 以查看是否已存在一个名称为我要插入/更新的文档。
  2. 如果不存在冲突,请执行 upsert。

我希望能够在单个操作中完成此操作,如果出现错误,请知道是哪个字段导致了问题。

如果操作是创建一个新文档,这是可能的。 Mongo 返回错误 E11000 duplicate key error index: {index name}。这有点小技巧,但我可以使用正则表达式来解析索引名称(在我的情况下,其中包含字段名称)。

但是,当更新文档时,错误消息没有关于索引或字段的信息。就是“E11001 duplicate key on update”。

是否有其他人有关于执行 upserts 的智能方法的建议,并知道哪些字段会导致唯一索引问题(如有必要)?希望避免server-side stored JavaScript functions...

【问题讨论】:

  • 您运行的是哪个版本的 MongoDB?这似乎已在 2.0.1 中修复。
  • 是的。我刚刚对其进行了测试,它在 upsert 期间也给出了有问题的索引
  • 我使用的是 1.8.x,但很高兴知道 2.x 中的这一变化。谢谢@KyleBanker 和@RemonvanVliet!

标签: mongodb


【解决方案1】:

对于插入,解析错误消息是您最好的选择。对于更新,不幸的是,除了尝试检查集合中的现有数据之外,没有更好的方法。不过,请随时通过 https://jira.mongodb.org 提出增强功能。

【讨论】:

    猜你喜欢
    • 2017-04-06
    • 1970-01-01
    • 2016-03-30
    • 1970-01-01
    • 2017-07-11
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多