我遇到了Mongo分片群集(MSC)中的重复键错误,该错误在使用Mongo副本集时不会发生。
我在客户端应用程序中具有简单的操作:
// pseudocode - email is unique key
subscriber = db.newsletter.find({email: "john@smith.com"})
if (subscriber == null) {
db.newsletter.insert({email: "john@smith.com", name: "John"})
} else {
db.newsletter.update({email: "john@smith.com"}, {name: "John"})
}
我没有在上面的代码中包含它,但是我需要检索文档的_id,因此不能使用upsert。
错误: 如果对相同的电子邮件和新的电子邮件执行两次以上过程,将导致重复的密钥错误。第二次迭代将无法找到订户,因此尽管文档已在集合中,它仍将尝试插入。
据我所知,具有上述客户端的单个实例运行不会导致重复的密钥错误,但确实如此。
答案 0 :(得分:2)
这将是findAndModify command或findOneAndUpdate method的工作。
有一个upsert
标志,如果该文件不存在,它将创建该文件。您还必须使用new
标志来返回新文档(如果已创建)。