执行查询时,我可以通过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对象的情况下更新?
答案 0 :(得分:1)
你根本不需要拉/取。您可以直接发送$set
命令:
Product.where(id: product_hsh["_id"]).update_all(name: "Some other text")