Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 上推法_Ruby_Mongoid_Mongodb Query_Upsert - Fatal编程技术网

Ruby 上推法

Ruby 上推法,ruby,mongoid,mongodb-query,upsert,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轻松做到这一点) 推销产品 这适用于升级: User.new(username: 'Hello').u

我有一个模型用户:

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
问题是这将删除嵌入式产品(未指定products属性)

我可以要求mongoid跳过将数组设置为空吗? 我可以要求mongoid在产品阵列的末尾推出新产品吗? 大概是这样的:


User.new(用户名:'Hello').push(产品:[Product.new(名称:'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中执行插入/更新魔术
在第二个散列中,您还可以指定$inc、$dec、$pop、$set等。。。这是非常有用的