在没有先拉出Mongoid对象的情况下在MongoDB中更新?

时间:2017-07-21 12:43:55

标签: ruby mongodb mongodb-query mongoid

执行查询时,我可以通过Mongoid:

product_obj = Product.where(
                            _id: "58f876f683c336eec88e9db5"
                           ).first # => #<Product _id: 58f876f683c336eec88e9db5, created_at: nil, updated_at: nil, sku: "123", name: "Some text", ...)

或者我可以绕过它:

product_hsh = Product.collection.find( {
                                         _id: BSON::ObjectId.from_string("58f876f683c336eec88e9db5")
                                       }, {
                                         projection: {
                                          _id: 1,
                                          name: 1
                                        }
                                      } ).first # => {"_id"=>BSON::ObjectId('58f876f683c336eec88e9db5'), "name"=>"Some text"} 

我更愿意规避,因为它表现得更好;我可以限制响应中的哪些字段。

然而,我的问题是如何进一步使用退回的产品。响应是一个哈希,而不是一个对象,所以如果我必须更新它,我需要通过Mongoid将它拉出来,从而性能提升不见了:

Product.find(product_hsh["_id"]).update_attribute(:name, "Some other text")

我的问题是:如何在不先拉出Mongoid对象的情况下更新?

1 个答案:

答案 0 :(得分:1)

你根本不需要拉/取。您可以直接发送$set命令:

Product.where(id: product_hsh["_id"]).update_all(name: "Some other text")