Являются ли данные возвращенными из Mongoose неизменяемыми?
Я хочу добавить к возвращаемым данным из запроса мангуста:
User.findById(userId, function(err, data) {
if (!err) {
data.newvar = 'Hello, world';
}
});
Однако, когда я консоль регистрирую вывод, newvar не существует. Я также пробовал это, используя расширение Underscore:
_.extend(data, {'newvar': 'Hello, world'});
Не повезло. Поскольку у меня есть вложенные документы, использование мелкой копии не будет работать. Есть ли способ добавить данные здесь?
Ответы
Ответ 1
Один из способов справиться с этим состоит в том, чтобы преобразовать экземпляр модели mongoose в простой объект, который вы полностью контролируете, вызывая toObject()
на нем:
User.findById(userId, function(err, data) {
if (!err) {
data = data.toObject();
data.newvar = 'Hello, world';
}
});
Если вам требуется более структурированное решение, вы можете добавить виртуальные атрибуты в свою схему, как описано здесь.
Ответ 2
Как оказалось, документы Mongoose являются их собственным специальным классом, а не стандартными объектами Javascript. Чтобы получить параметр javascript, который может быть расширен, вы должны использовать метод toObject().
Ответ 3
Теперь вы можете использовать метод lean() для возврата простого объекта js:
User.findById(userId)
.lean()
.exec( function(err, data) {
if (!err) {
data.newvar = 'Hello, world';
}
});
Почему вы не можете изменять данные, возвращаемые Mongoose Query (например: findById)