Mongoid push with upsert

时间:2015-12-08 09:59:42

标签: ruby mongoid mongodb-query upsert

我有模特用户:

class User
  field :username, type: String
  embeds_many :products
end

class Product
  field :name, type: String
  embedded_in :user
end

我想进行单一操作:

  • 插入用户
  • 在用户已经存在的情况下更新用户(我可以轻松地使用upsert)
  • 推送产品

这适用于upserting:

User.new(username: 'Hello').upsert

问题是这将删除嵌入式产品(未指定products属性)。

我可以让mongoid跳过将数组设置为空吗? 我可以问mongoid在产品阵列的最后推出新产品吗? 像这样:

User.new(username: 'Hello').push(products: [Product.new(name: 'Screen')]).upsert

1 个答案:

答案 0 :(得分:0)

最后,我最后通过手动编写以下查询:

User.mongo_client[:users].update_one({username: 'Hello'}, 
                                     {"$set" => {first_name: 'Jim', last_name: 'Jones'},
                                      "$pushAll" => [products: [{name: 'Screen'}, {name: 'Keyboard'}]
                                     },
                                     upsert: true)

其中:

  • $ set - 是我们要为给定文档设置的参数
  • $ pushAll - 当你使用$ push时你只能指定一个元素,$ pushAll允许你追加多个元素(当你只指定一个元素时它会像$ push一样)
  • upsert - 将在mongodb中执行插入/更新魔术

在第二个哈希中,您还可以指定$ inc,$ dec,$ pop,$ set等...这非常有用。