Подтвердить что ты не робот

Вставить простой объект в файл мангуста

ОБНОВЛЕНИЕ 1: 5 голосов было получено, поэтому я отправил запрос на добавление функции: https://github.com/LearnBoost/mongoose/issues/2637

Пожалуйста, проголосуйте там +1, чтобы основная команда знала, что вам нужна эта функция.


ОБНОВЛЕНИЕ 2: См ответ ниже...


ОРИГИНАЛЬНАЯ ПОЧТА:

Допустим, я делаю "простой" запрос к коллекции ИЛИ получаю некоторые данные из службы REST и получаю массив объектов (не документов mongoose).

Эти объекты уже существуют в базе данных, но мне нужно преобразовать некоторые/все эти объекты в документы mongoose для отдельного редактирования/сохранения.

Я прочитал источник, и многое происходит, когда у mongoose есть данные из базы данных (заполнение, приведение в исходное состояние, инициализация и т.д.), Но, похоже, не существует метода для "раскрытия" этого внешнего мира.

Я использую следующее, но это просто кажется хакерским ($data - простой объект):

// What other properties am I not setting?  Is this enough?
var doc = new MyModel( $data );
doc.isNew = false;

// mimicking mongoose internals
// "init" is called internally after a document is loaded from the database
// This method is not documented, but seems like the most "proper" way to do this.
var doc = new MyModel( undefined );
doc.init( $data );

ОБНОВЛЕНИЕ: После дополнительных поисков я не думаю, что есть способ сделать это еще, и первый способ выше - ваша лучшая ставка (mongoose v3.8.8). Если кто-то еще заинтересован в этом, я сделаю запрос функции для чего-то вроде этого (оставьте комментарий или upvote, пожалуйста):

var doc = MyModel.hydrate( $data );
4b9b3361

Ответ 1

Проводка моего собственного ответа, чтобы он не оставался открытым:

Модели версии 4 (стабильная версия, выпущенная в 2015-03-25) теперь предоставляет метод hydrate(). Ни одно из полей не будет помечено как грязное первоначально, то есть вызов save() ничего не сделает, пока поле не будет изменено.

https://github.com/LearnBoost/mongoose/blob/41ea6010c4a84716aec7a5798c7c35ef21aa294f/lib/model.js#L1639-1657

Очень важно отметить, что это предназначено для преобразования простого объекта JS, загруженного из базы данных, в файл mongoose. Если вы получаете документ из службы REST или что-то в этом роде, вы должны использовать findById() и update().

Для тех, кто живет опасно:

Если вы действительно хотите обновить существующий документ, не касаясь базы данных, я полагаю, вы могли бы назвать hydrate(), пометить поля как грязные, а затем вызвать save(). Это не слишком отличается от метода установки doc.isNew = false;, как я предложил в своем первоначальном вопросе (за исключением того, что вы не должны отмечать поля как грязные). Однако Валери (из команды мангустов) предложил не делать этого. Это может привести к ошибкам проверки (и другим вопросам) в определенных сценариях и, как правило, не является хорошей практикой.

Ответ 2

  • Если вы получаете ответ от службы REST и говорите, что у вас есть модель пользователя mongoose

var User = mongoose.model('User');
var fields = res.body; //Response JSON
var newUser = new User(fields);
newUser.save(function(err,resource){
  console.log(resource);
});