Вставить простой объект в файл мангуста
ОБНОВЛЕНИЕ 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 );
Ответы
Ответ 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);
});