2012-05-14 5 views
6

Estoy tratando de ejecutar una consulta nativa de MongoDB find a través de la collection propiedad de un Mongoose Model. No estoy proporcionando una devolución de llamada, así que espero que el resultado devuelva un objeto Cursor, pero en su lugar devuelve undefined. De acuerdo con el Mongoose docs, se puede acceder al controlador que se está utilizando a través del YourModel.collection y si cambio al código de controlador nativo find devuelve un Cursor por lo que no puedo entender qué está pasando.Native driver find from Mongoose model not returning Cursor

He aquí un fragmento de código que reproduce el problema:

var db = mongoose.connect('localhost', 'test'); 
var userSchema = new Schema({ 
    username: String, 
    emailAddress: String 
}); 
var User = mongoose.model('user', userSchema); 

var cursor = User.collection.find({}); 
// cursor will be set to undefined 

he tratado de entrar en el código con el nodo-inspector, pero no me está dejando. ¿Alguna idea de lo que estoy haciendo mal?

Respuesta

11

Todos los métodos del controlador nativo se procesan en el nextTick, por lo que no se devuelven los valores devueltos desde el controlador.

En su lugar, puede pasar una devolución de llamada y la segunda arg devuelta es el cursor.

User.collection.find({}, function (err, cursor) { 
    // 
}); 

¿Por qué tiene que omitir la mangosta?

+1

Ah, bueno eso lo explica. Gracias, Aaron. La motivación para hacerlo fue solo experimentar durante las pruebas de rendimiento. Y cuando no funcionó como esperaba, no pude dejarlo pasar hasta que entendí lo que estaba pasando. – JohnnyHK

+0

Para cualquier persona que encuentre esto y no esté seguro de qué hacer con él, eludir una mangosta como esta y usar el controlador nativo devolverá un cursor, que luego deberá convertir en una matriz si desea usarlo (como res.json (doc) o lo que sea) ... User.collection.find ({}, la función (err, cursor) { cursor.toArray (function (err, doc) {// hacer cosas con doc }) ; }); –

Cuestiones relacionadas