更新:有关MongoDB 1.8.x的问题已被提出,并且已接受的解决方案与1.8相关。但请注意,Mongo 2.x已对错误消息进行了更改,以便您可以确定哪些字段会在更新和插入时生成错误(请参阅下面的Kyle和Remon的注释)。
有没有办法尝试Mongo upsert,如果有唯一的索引违规,知道哪个字段导致问题 - 所有在一个数据库操作中?
例如,假设我有一个customers
集合,其_id
和name
属性。另外,假设name
存在unique index,以确保没有两个customer
文档具有相同的name
。
目前,我执行两个数据库操作来执行upsert:
customers
以查看是否已存在包含我即将插入/更新的名称的文档。我希望能够在一次操作中执行此操作,如果出现错误,请知道哪个字段导致了问题。
如果操作是创建新文档,则这是可能的。 Mongo会返回错误 E11000 duplicate key error index: {index name}
。这有点像黑客攻击,但是我可以使用正则表达式来解析索引名称(在我的例子中,它有字段名称)。
但是,当更新文档时,错误消息中没有关于索引或字段的信息。它只是“ E11001 duplicate key on update
”。
是否有其他人有关于智能方法进行upserts的建议,并知道哪些字段导致了唯一的索引问题,如有必要?希望避免server-side stored JavaScript functions ......
答案 0 :(得分:3)
对于插入,解析错误消息是您最好的选择。不幸的是,对于更新,除了尝试检查集合中的现有数据之外,没有更好的方法。尽管如此,请随意提高https://jira.mongodb.org的增强效果。