带有 upsert 的 Mongoid 推送

Mongoid push with upsert

我有模特用户:

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

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

我想进行一次操作:

这适用于更新:

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

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

我可以要求 mongoid 跳过将数组设置为空吗? 我可以要求 mongoid 在产品数组的末尾推送新产品吗? 像这样:

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

最后我手动编写了以下查询:

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
  • 中执行 insert/update 魔法

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