【问题标题】:Mongodb - duplicate fields in $set and $setOnInsertMongodb - $set 和 $setOnInsert 中的重复字段
【发布时间】:2014-12-18 17:29:00
【问题描述】:

this 帖子中,接受的答案解释说,在 upsert 操作中,$set$setOnInsert 下不能有相同的字段。

有人能解释这是为什么吗?看来$setOnInsert应该和$set不冲突,因为前者在插入文档时使用,后者在文档更新时使用。

【问题讨论】:

  • 老实说,我无法解释为什么会出现这种情况;我也希望看到这个实现。有一个增强请求 SERVER-10711,以允许 $set$setOnInsert 在同一字段的同一更新中工作。您可以评论、观看和支持该问题以提高其优先级。
  • 感谢您指出这一点@wdberkeley。你知道是否有不需要两个查询的解决方法吗?

标签: mongodb upsert


【解决方案1】:

我遇到了这个问题。如果有人在寻找解决方案,您需要了解 $set 和 $setOnInsert 机制是如何工作的 如果找到 $set 则刷新(忽略 $setOnInsert) $setOnInsert 插入一条新记录(然后执行 $set) 我不知道这一点,并认为只有一个操作员可以工作。这样我就可以摆脱重复的字段

【讨论】:

  • 嗯!这就是为什么他们不允许同时在两个字段中使用相同的字段。这是有道理的(因为它的工作方式)。虽然我仍然认为他们应该支持一些东西来允许在插入时设置不同的值,如the comment below
【解决方案2】:

$set 运算符也用于 upsert。所以在 $set$setOnInsert 上引用相同的字段是无稽之谈。

只需在一个空集合上试试这个:

db.items.remove();
db.items.update({},{$set:{a:1},$setOnInsert:{b:2}},{upsert:1})
db.items.find({});

【讨论】:

  • 这不是“废话”。例如,如果刚刚插入文档,我需要一个字段为true,如果刚刚更新,我需要一个字段为false。如果 $set(as false) 和 $setOnInsert(as true) 中都存在相同的字段,并且插入了文档,则 $setOnInsert 中的字段应该优先,即使它也存在于 @ 987654329@部分。
  • @maganap 我想这样做。有办法吗?
  • @GrayHat 自从我上次使用 MongoDB 以来已经很长时间了,所以我真的不知道。抱歉,我帮不上忙。
猜你喜欢
  • 2016-08-02
  • 2017-01-10
  • 2015-09-28
  • 2017-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-30
  • 1970-01-01
相关资源
最近更新 更多