Как вернуть только документ, созданный после выполнения save () с помощью mongoose

#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() возвращает: 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 применить все методы получения (пути и виртуальные методы получения), по умолчанию значение false
  • aliases примените все псевдонимы, если virtuals=true по умолчанию установлено значение true
  • virtuals применить виртуальные методы получения (можно переопределить параметр getters), по умолчанию значение false
  • minimize удалить пустые объекты, по умолчанию значение true
  • transform функция преобразования, применяемая к результирующему документу перед возвратом
  • depopulate удалите все заполненные пути, заменив их исходными ссылками, по умолчанию false
  • versionKey включать ли ключ версии, по умолчанию значение true
  • flattenMaps преобразование карт в POJOs. Полезно, если вы хотите, чтобы JSON.stringify() выдавал результат ToObject(), по умолчанию значение false
  • useProjection установите true значение, чтобы пропустить поля, которые исключены в проекции этого документа. Если вы не указали проекцию, при этом будет пропущено любое поле, имеющееся select: false в схеме.

Комментарии:

1. Работает как шарм. Я много искал пример, подобный вашему. prnt.sc/uufqfa

Ответ №2:

Тогда попробуйте так

 let res = await Model.save();
return res._doc;