2015-06-01 5 views
1

Я попытался много способов, чтобы обновить существующий BSON документ, но он никогда не меняется в моей MongoDB:сохранить/обновить (Мопед) BSON :: Документ с рубином

col = db["collection"] 
col.insert({"ben": 1}) 
doc = col.find().to_a.first 
# => {"_id"=>BSON::ObjectId('556c7f1b167e70640070a4d9'), "ben"=>1} 

первой попытке обновить:

doc.merge!({"ben": 5, "ams": 6}) 
col.find().to_a.first 
# => {"_id"=>BSON::ObjectId('556c7f1b167e70640070a4d9'), "ben"=>1} 

вторая попытка обновить:

doc.update({"ben": 5, "ams": 6}) 
col.find().to_a.first 
# => {"_id"=>BSON::ObjectId('556c7f1b167e70640070a4d9'), "ben"=>1} 

третья попытка ...

doc["ben"] = 5 
doc["ams"] = 6 
doc.save 
# NoMethodError: undefined method `save' for #<BSON::Document:0x00000003f284d0> 

Как вы можете видеть, ни одно из перечисленных выше не работает для меня. Я не мог найти никаких других предложений поиска Google. Знаете ли вы способы обновления моего документа? Является ли это возможным?

ответ

2

Как только вы сделаете это:

col.find().to_a 
#   ^^^^ 

вы работаете с простым массивом Рубина хэш, которые не имеет никакого отношения к базе данных. Так что, когда вы говорите:

doc.update({"ben": 5, "ams": 6}) 

вы звоните Hash#update. Если вы хотите обновить что-то, что ты позвонишь update на каких find возвращений:

col.find.update(:$set => { 'ben' => 5, 'ams' => 6 }) 

или если вы хотите, чтобы заменить весь документ:

col.find.update('ben' => 5, 'ams' => 6) 

Вы бы обычно сказать find какой конкретный документ вы, конечно, хотите.

Обратите внимание, что update обновляет только первый соответствующий документ, который он находит, если вы хотите обновить все соответствующие документы, то вы должны использовать update_all.

+0

Привет, ваша точка зрения очень ясна. Благодаря! Означает ли это, что я не могу обновлять документы во время итерации? (Например: 'col.find(). Each {| d | d.update (" ben ": 5," ams ": 6)}') – benams

+3

Правильно, это не сработает, потому что 'd' будет просто простой хэш внутри блока 'each'. Вам понадобится 'col.find (: _ id => ...). Update (...)' внутри итерации. Обычно вы должны использовать экземпляры Mongoid, чтобы заботиться обо всем этом, мопед обычно используется только тогда, когда вы хотите напрямую поговорить с базой данных. –

Смежные вопросы