Атомная стойкость в монгоиде с толчком - PullRequest
0 голосов
/ 06 мая 2011

Я не понимаю атомарного толчка метода Mongoid.

У меня есть этот документ:

class Campaign
  include Mongoid::Document

  field :messages, :type => Array # Array of hashes
end

И теперь в консоли игра с ним, но сообщения не сохраняются.Пример:

>> campaign = Campaign.last
=> #<Campaign _id: 4dc2b6617e296d53f000000d,...
>> data = {:from => 'user@example.com'}
=> {:from=>"user@example.com"}
>> campaign.push(:messages, data)
=> [{:from=>"user@example.com"}]

В журнале теперь написано:

MONGODB blabla_development['campaigns'].update({"_id"=>BSON::ObjectId('4dc2b6617e296d53f000000d')}, {"$push"=>{:messages=>{:from=>"user@example.com"}}})

Но если запросить этот документ еще раз, поле сообщений будет равно nil:

>> campaign = Campaign.last
=> #<Campaign _id: 4dc2b6617e296d53f000000d,...
>> campaign.messages
=> nil

Какя могу сохранить эти данные?

Спасибо

1 Ответ

1 голос
/ 06 мая 2011

Вы выдвигаете не массив, а хеш. Включите безопасный режим mongoid (mongomapper) , если вы хотите, чтобы mongodb отвечал «успешно» или «не удалось», вместо «хорошо, что угодно».

чтобы включить безопасный режим, попробуйте это

campaign.safe_mode?(:safe => true) #then carry on. warning, I haven't tested... 

push(... ,:safe => true) #mongomapper

или изменить config

persist_in_safe_mode true 

должно быть верно в среде разработки в любом случае.

Чтобы исправить вашу проблему:

#to use array instead of hash, do 
data = ["elem1", "elem2"]
#or
campaign.messages << "elem1"
campaign.messages << "elem2"
campaign.save!
...