MongoDB - ON DUPLICATE KEY ..UPDATE 行为
Posted
技术标签:
【中文标题】MongoDB - ON DUPLICATE KEY ..UPDATE 行为【英文标题】:MongoDB - ON DUPLICATE KEY ..UPDATE behaviour 【发布时间】:2014-03-10 20:01:31 【问题描述】:我已经查了很多类似的回答,我觉得没有什么能清楚地回答这个问题或者答案是不正确的。
问题:
db.todos.insert(_id:1, name:'Test1')
db.todos.insert(_id:2, name:'Test2')
添加了以上 2 个文档,没有问题。现在我正在尝试使用带有 upsert 的更新,如果发现重复键,它会插入。
db.todos.update(name:'Test3',_id:2, name:'Test4',upsert:true)
但这会产生以下错误:
11000 duplicate key error index: todos.todos.$_id_ dup key: : 2.0
我的问题是,有没有办法在 MongoDB 上实现 ON DPULICATE KEY ..UPDATE 行为?
【问题讨论】:
你能用简单的话解释一下你想要实现的目标吗,即“如果存在符合条件 A 和 B 的文档,则执行此操作,否则执行此操作?”我认为您的问题有答案,但是带有 Test3 和 Test4 值的更新语句完全令人恼火 OP,请编辑问题:'Test3' -> 'Test2',因为您遇到的错误是在执行更新语句后第二次,确实不是反映在问题文本中:) 你还没有理解我的意思.. 01. 我想实现 ** ON DUPLICATE KEY UPDATE ** 行为 02. 使用 Insert 我认为这是不可能的(如果我错了请纠正我) 03. 我故意放了'Test3',因为如果我放了'Test2',它将匹配现有记录并进行更新。但是 Mongo 文档说的是,如果找不到匹配的记录,它将尝试插入,因为我正在发送 'upsert:true' 如果你想这样做,为什么不把 _id 放到条件中呢?如果插入会进行重复的 eky 更新,它仍然会被写出 【参考方案1】:将_id:2, name:'Test4'
更改为name:'Test4'
不需要指定你的_id,MongoDB会为你生成一个唯一的id。我知道可能有一些用例需要创建自定义 _id;但是,我认为应该谨慎行事。
【讨论】:
我想试试,DUPLICATE KEY..所以这里不能删除 _id 好的,那是不可能的。您需要在应用程序级别进行处理。【参考方案2】:db.todos.update(name:'Test3',_id:2, name:'Test4',upsert:true)
表示查找名称为Test3
的文档,如果没有此文档,则创建一个带有_id:2,名称:'Test4'的文档。
由于没有这样的行,它会尝试插入与现有 _id:2 冲突的 _id:2,name:'Test4'。
【讨论】:
以上是关于MongoDB - ON DUPLICATE KEY ..UPDATE 行为的主要内容,如果未能解决你的问题,请参考以下文章
MongoDB - Installing MongoDB on Windows
在 ruby on rails 中,感叹号后面是啥意思? [复制]