【问题标题】:MongoDB - ON DUPLICATE KEY ..UPDATE behaviourMongoDB - ON DUPLICATE KEY ..UPDATE 行为
【发布时间】: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 更新,它仍然会被写出

标签: mongodb mongoose nosql


【解决方案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'}。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多