在mongodb中upsert hash。删除未使用的密钥

时间:2015-03-06 12:42:25

标签: ruby mongodb mongoid upsert

From the Mongo documentation

  

如果指定多个字段 - 值对,则$ set将更新或创建   每个领域。

我有一个像这样的mongoid文件:

class MyCounter
  include Mongoid::Document

  field :date, type: Date
  field :properties, type: Hash
end

当我尝试更改这样的属性时:

hash = {properties.0 => 50, properties.1 => 100 }
MyCounter.where(something).find_and_modify(
    { '$set' => hash, {'upsert' => 'true', new: true}
)

它将旧密钥保留在属性哈希上。

在文档中完全替换(并创建新文档,如果它不存在)的正确方法是什么?

修改

我目前正在做这个愚蠢的事情:

MyCounter.where(
  date: date
).find_and_modify(
  { '$unset' => { properties: nil} }, {'upsert' => 'true', new: true}
)

MyCounter.where(
  date: date
).find_and_modify(
  { '$set' => hash }, {'upsert' => 'true', new: true}
)

1 个答案:

答案 0 :(得分:0)

只是不要使用$ set。只传递field: value对,所有字段都被替换(除了_id字段)

这应该可以正常工作。

MyCounter.where(
  date: date
).find_and_modify(
  hash, {'upsert' => 'true', new: true}
)

http://docs.mongodb.org/manual/reference/method/db.collection.update/#example-update-replace-fields