Использование операций на уровне коллекции в Mongoid - PullRequest
0 голосов
/ 05 декабря 2011

Я экспериментирую с Ruby (который я не очень хорошо знаю) и Mongo (что я знаю). Я создал модель Mongoid с полем :accessed. Я знаю, что в Монго я могу просто запустить что-то вроде:

data = db.collection.findAndModify({
  query: { ... },
  update: {$inc: {accessed: 1}}
})

Но когда я запускаю MyModel.collection.find_and_modify в Mongoid, я получаю обратно то, что кажется хешем. Есть ли способ, которым я могу привести это в экземпляр моего модельного класса, или сделать лучший поддерживаемый запрос в Mongoid?

1 Ответ

1 голос
/ 05 декабря 2011

По умолчанию find_and_modify возвращает хэш, проверьте документацию

Параметры:

  • opts (Hash) (по умолчанию:{}) - настраиваемый набор параметров

Хэш параметров (опции):

  • : запрос (хэш) - по умолчанию: {} -документ селектора запросов для сопоставления с нужным документом.
  • : update (Hash) - по умолчанию: nil - операция обновления, выполняемая для сопоставленного документа.
  • : sort (Array, String, OrderedHash) - по умолчанию: {} - укажите опцию сортировки для запроса, используя любой из вариантов сортировки, доступных для Cursor # sort.Порядок сортировки важен, если запрос будет соответствовать нескольким документам, поскольку только первый соответствующий документ будет обновлен и возвращен.
  • : remove (Boolean) - default: false - Если true, удаляет возвращенный документ изcollection.
  • : new (Boolean) - по умолчанию: false - если true, возвращает обновленный документ;в противном случае возвращает документ до обновления.

Возвращает:

  • (Хеш) - соответствующий документ.

Но вы можете преобразовать хеш в объект коллекции, просто инициализировав модель, передав хеш в качестве аргумента

 >> x = MyModel.collection.find_and_modify(:query => {...},:update => {...})
 >> x.class
 >> BSON::OrderedHash
 >> obj = MyModel.new(x)
 >> obj.class
 >> MyModel

И теперь вы можете применить любую преобразование mongoid к преобразованному объекту.Это будет отлично работать.

Надеюсь, это поможет

...