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

MongoDB介绍

mongoDB简介

在 ruby​​ on rails 中,感叹号后面是啥意思? [复制]

install the mongodb on linux system

MongoDb on Catalina在启动时卡住了。