Mongoid 5: find_one_and_update с returnNewDocument

Возможно ли, что Mongoid v5.1.2 игнорирует returnNewDocument опция при использовании с find_one_and_update?

Рассмотрим следующий код:

next_number = TrackingId.where(id: id).find_one_and_update({
    :$inc => {
      auto_increment_counter: 1
    }
  },
  upsert: true,
  returnNewDocument: true
).auto_increment_counter

где auto_increment_counter целое число field :auto_increment_counter, type: Integer, default: 0 в этом классе.

Однако, когда документ не найден, он создает его, но не возвращает вновь созданный документ. Итак, я получаю nil обратно из find_one_and_update и это ломается.

1 ответ

Решение

Я подозреваю, что реализация mongoid find_one_and_update изменит флаг returnNewDocument на return_new_document или $ returnNewDocument. Позже я посмотрю на кодовую базу mongoid и подтвердю.

Обновление: Итак, я поиграл в pry и посмотрел код. Позже я смог подтвердить это и в документах. Опция, которую вы ищете, это return_document, для которого вы устанавливаете либо: before, либо:after (см. Документы: http://www.rubydoc.info/github/mongoid/mongoid/Mongoid%2FContextual%2FMongo%3Afind_one_and_update)

Поэтому ваш запрос должен быть:

next_number = TrackingId.where(id: id).find_one_and_update({
    :$inc => {
      auto_increment_counter: 1
    }
  },
  upsert: true,
  return_document: :after
).auto_increment_counter
Другие вопросы по тегам