JohnSmith1976
JohnSmith1976

Reputation: 666

Updating in MongoDB without first having to pull a Mongoid object?

When performing queries I can go through Mongoid:

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

​ or I can circumvent it:

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

I prefer to circumvent, because it performs better; I can limit which fields to get in the response.

My problem, however, is how to further work with the returned product. The response is a hash, not an object, so if I have to update it I need to pull it through Mongoid anyway, and thereby the performance gains are gone:

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

My question is: how do I update without first having to pull a Mongoid object?

Upvotes: 0

Views: 179

Answers (1)

Sergio Tulentsev
Sergio Tulentsev

Reputation: 230521

You don't need to pull/fetch at all. You can just send the $set commands directly:

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

Upvotes: 1

Related Questions