#javascript #node.js #mongoose
#javascript #node.js #mongoose
Вопрос:
Когда я использую return await Model.save()
, они возвращают много данных. Есть способ вернуть только документ?
Код:
async (data) =>{
const charData = new MyModel({
steamId: data.steam,
phone: data.phone,
registration: data.registration,
})
return await MyModel.save()
}
Я искал на многих веб-сайтах, но не нашел ни одного примера использования асинхронных функций.
Есть пример, который MyModel.save()
возвращает:
Итак, я хочу получить только объект _doc вместо всего этого, когда return await MyModel.save()
Комментарии:
1. предполагая, что этот «документ», который вы хотите, является свойством любого
.save
возвращаемого,const x = await MyModel.save(); return x.something
— гдеsomething
находится «документ» — в противном случае, что это за «документ», который вы ищете?2. @JaromandaX Как сказано в документе ( mongoosejs.com/docs/api.html#model_Model-save ) Они возвращают выполнение обещания. Я ищу тот же результат .lean() при выполнении запроса / поиска ( mongoosejs.com/docs/api.html#query_Query-lean )
3. как говорится
If save is successful, the returned promise will fulfill with the document saved.
— итак, вы возвращаете сохраненный документ — вы, вероятно, неправильно используете любые вызовыasync (data) =>{
… вы понимаете, что ваша функция возвращает обещание, потомуasync
что функции возвращают обещание4. в качестве отступления… вам никогда не нужно
return await somePromise
— вы можете простоreturn somePromise
— и, на самом деле, в вашем случае функция даже не нужнаasync
, поскольку вам на самом деле никогда не нужноawait
— так что удалитеasync
и удалитеawait
и убедитесь, что все, что вызывает ваша функция, делает это с ожидаемым результатом, являющимся обещанием5. @JaromandaX Я отредактировал вопрос и предоставил результат, который я получаю.
Ответ №1:
Document.prototype.toObject()
преобразует документ mongoose в обычное представление объекта javascript.
async (data) =>{
const charData = new MyModel({
steamId: data.steam,
phone: data.phone,
registration: data.registration,
})
await charData.save()
return charData.toObject({ getters: true })
}
Обратите внимание на параметры, которые влияют на представление документа:
getters
применить все методы получения (пути и виртуальные методы получения), по умолчанию значение falsealiases
примените все псевдонимы, еслиvirtuals=true
по умолчанию установлено значение truevirtuals
применить виртуальные методы получения (можно переопределить параметр getters), по умолчанию значение falseminimize
удалить пустые объекты, по умолчанию значение truetransform
функция преобразования, применяемая к результирующему документу перед возвратомdepopulate
удалите все заполненные пути, заменив их исходными ссылками, по умолчанию falseversionKey
включать ли ключ версии, по умолчанию значение trueflattenMaps
преобразование карт в POJOs. Полезно, если вы хотите, чтобы JSON.stringify() выдавал результат ToObject(), по умолчанию значение falseuseProjection
установитеtrue
значение, чтобы пропустить поля, которые исключены в проекции этого документа. Если вы не указали проекцию, при этом будет пропущено любое поле, имеющеесяselect: false
в схеме.
Комментарии:
1. Работает как шарм. Я много искал пример, подобный вашему. prnt.sc/uufqfa
Ответ №2:
Тогда попробуйте так
let res = await Model.save();
return res._doc;