2012-04-08 119 views
11

如何能在一个[原子]语句蒙戈做到这一点:的MongoDB:对重复键更新插入

insert mytable set MyUniqueKey = ?, X = ? on duplicate key update Y = ? 

当它第一次将设置X值,但之后,它只会更新这个语句被执行Y值。

只有MyUniqueKey是唯一键的一部分,应该查找重复。

回答

5

我在mongodb用户组上问过这个问题,答案是这是不可能的,这是一个开放的issue

+4

此问题已在MongoDB 2.4中关闭,您现在可以使用['$ setOnInsert'](http://docs.mongodb.org/manual/reference/operator/setOnInsert /)。 – str 2013-10-03 15:10:31

14

您正在寻找Update命令的upsert option。这里的文档应该足够了。

+0

请你举个例子。我已经尝试了许多选项的组合,但我无法选择插入时设置的字段,但在更新时排除。 – 2012-04-08 04:35:08

+0

有一个字段我喜欢只在第一次插入时设置,但在更新时保持未触及。 – 2012-04-08 04:37:08

+0

您必须使更新的'query'部分中的'Y'部分代替部分'update'部分。 – 2012-04-08 05:11:54

1

$setOnInsert

我把它叫做 “MyCollection的” 而不是 “MYTABLE”。 你可以做到以下几点:

db.mycollection.update(
    { MyUniqueKey: "?" }, 
    { 
     $set: {"y": "?"}, 
     $setOnInsert: { 
      MyUniqueKey: "?", 
      "x": "?", 
    }, 
    { upsert: true } 
) 

基本上$组始终运行,除了当文件不存在。然后$ setOnInsert将运行。