【发布时间】:2011-12-12 16:56:00
【问题描述】:
更新:这个问题是针对 MongoDB 1.8.x 提出的,并且接受的解决方案与 1.8 有关。但是请注意,Mongo 2.x 已对错误消息进行了更改,以便您可以分辨哪些字段在更新和插入时产生错误(请参阅下面来自 Kyle 和 Remon 的 cmets)。 p>
有没有办法尝试 Mongo upsert,如果存在唯一索引违规,知道是哪个字段导致问题 - 全部在一个数据库操作中?
例如,假设我有一个带有 _id 和 name 属性的 customers 集合。另外,假设name 存在一个unique index,以确保没有两个customer 文档拥有相同的name。
目前,我执行 两个 数据库操作来执行 upsert:
- 查询
customers以查看是否已存在一个名称为我要插入/更新的文档。 - 如果不存在冲突,请执行 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