带有 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
我想进行一次操作:
- 插入用户
- 在用户已经存在的情况下更新用户(我可以使用 upsert 轻松完成)
- 推送产品
这适用于更新:
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 等...这非常有用。
我有模特用户:
class User
field :username, type: String
embeds_many :products
end
class Product
field :name, type: String
embedded_in :user
end
我想进行一次操作:
- 插入用户
- 在用户已经存在的情况下更新用户(我可以使用 upsert 轻松完成)
- 推送产品
这适用于更新:
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 等...这非常有用。