Si te encuentras con algo que no comprendes puedes dejarlo en los comentarios y trataremos de ayudarte lo más rápido posible.
Solución:
Básicamente, cuando se usa mangosta, los documentos se pueden recuperar usando ayudantes. Todo método modelo que acepte condiciones de consulta puede ejecutarse mediante un callback
o la exec
método.
callback
:
User.findOne( name: 'daniel' , function (err, user)
//
);
exec
:
User
.findOne( name: 'daniel' )
.exec(function (err, user)
//
);
Por lo tanto, cuando no pasa una devolución de llamada, puede crear una consulta y, finalmente, ejecutarla.
Puede encontrar información adicional en los documentos de mongoose.
ACTUALIZAR
Algo a tener en cuenta al usar Promises en combinación con las operaciones asíncronas de Mongoose es que las consultas de Mongoose son no promesas Las consultas devuelven un entonces capazpero si necesitas un verdadero Prométeme que debes usar el exec
método. Puede encontrar más información aquí.
Durante la actualización noté que no respondí explícitamente la pregunta:
¿Nunca antes había visto ese método en Javascript? ¿Qué hace exactamente?
Bueno es no un método de JavaScript nativo, pero parte de la API de Mongoose.
Daniel ha respondido esto muy bien. Para elaborar una lista exhaustiva de formas de crear y ejecutar consultas, observe los siguientes casos de uso:
Construcción de consultas
Mongoose no ejecutará una consulta hasta que then
o exec
se le ha llamado. Esto es muy útil cuando se construyen consultas complejas. Algunos ejemplos pueden incluir el uso de populate
y aggregate
funciones
User.find(name: 'John') // Will not execute
Ejecución a través de devolución de llamada
Aunque a muchos no les gusta debido a su naturaleza de anidamiento, las consultas se pueden ejecutar proporcionando la devolución de llamada opcional.
User.find(name: 'John', (err, res) => ) // Will execute
Entonces API como Promises/A+
Las consultas de Mongoose proporcionan una then
función. Esto no debe confundirse con las promesas regulares. En pocas palabras, la especificación Promises/A+ requiere un then
funcione de manera muy parecida a como estamos acostumbrados con las promesas.
User.find(name: 'John').then(); // Will execute
Promise.all([User.find(name: 'John'), User.find(name: 'Bob')]) // Will execute all queries in parallel
La función ejecutiva
De los documentos de Mongoose If you need a fully-fledged promise, use the .exec() function.
User.find(name: 'John').exec(); // Will execute returning a promise
exec()
devolverá una promesa si no se proporciona una devolución de llamada. Entonces, el siguiente patrón es muy conveniente y genérico: puede manejar devoluciones de llamada o promesas muy bien:
function findAll(query, populate, cb)
let q = Response.find(query);
if (populate && populate.length > 0)
q = q.populate(populate);
// cb is optional, will return promise if cb == null
return q.lean().exec(cb);
Recomiendo usar las promesas de Bluebird con Mongoose, para hacer eso, usa esta llamada:
const mongoose = require('mongoose');
mongoose.Promise = require('bluebird');
Al final de todo puedes encontrar las notas de otros programadores, tú además eres capaz dejar el tuyo si lo deseas.