¿Cómo acceder a una colección preexistente con Mongoose?

Tengo una gran colección de 300 objetos de question en una test base de datos. Puedo interactuar fácilmente con esta colección a través del shell interactivo de MongoDB; Sin embargo, cuando trato de obtener la colección a través de Mongoose en una aplicación express.js, obtengo una matriz vacía.

Mi pregunta es, ¿cómo puedo acceder a este conjunto de datos ya existente en lugar de volver a crearlo en Express? Aquí hay un código:

 var mongoose = require('mongoose'); var Schema = mongoose.Schema; mongoose.connect('mongodb://localhost/test'); mongoose.model('question', new Schema({ url: String, text: String, id: Number })); var questions = mongoose.model('question'); questions.find({}, function(err, data) { console.log(err, data, data.length); }); 

Esto produce:

 null [] 0 

Mongoose agregó la capacidad de especificar el nombre de la colección bajo el esquema, o como el tercer argumento al declarar el modelo. De lo contrario, utilizará la versión plural dada por el nombre que asigne al modelo.

Pruebe algo como lo siguiente, ya sea mapeado por esquema:

 new Schema({ url: String, text: String, id: Number}, { collection : 'question' }); // collection name 

o modelo mapeado:

 mongoose.model('Question', new Schema({ url: String, text: String, id: Number}), 'question'); // collection name 

Aquí hay una abstracción de la respuesta de Will Nathan si alguien simplemente quiere una función fácil de copiar y pegar:

 function find (name, query, cb) { mongoose.connection.db.collection(name, function (err, collection) { collection.find(query).toArray(cb); }); } 

simplemente find(collection_name, query, callback); dar el resultado

por ejemplo, si tengo un documento {a: 1} en una colección ‘foo’ y quiero enumerar sus propiedades, hago esto:

 find('foo', {a : 1}, function (err, docs) { console.dir(docs); }); //output: [ { _id: 4e22118fb83406f66a159da5, a: 1 } ] 

Tuve el mismo problema y pude ejecutar una consulta sin esquema utilizando una conexión Mongoose existente con el siguiente código. He agregado una restricción simple ‘a = b’ para mostrar dónde agregaría tal restricción:

 var action = function (err, collection) { // Locate all the entries using find collection.find({'a':'b'}).toArray(function(err, results) { /* whatever you want to do with the results in node such as the following res.render('home', { 'title': 'MyTitle', 'data': results }); */ }); }; mongoose.connection.db.collection('question', action); 

Puedes hacer algo como esto, entonces accederás a las funciones nativas de mongodb dentro de mongoose:

 var mongoose = require("mongoose"); mongoose.connect('mongodb://localhost/local'); var connection = mongoose.connection; connection.on('error', console.error.bind(console, 'connection error:')); connection.once('open', function () { connection.db.collection("YourCollectionName", function(err, collection){ collection.find({}).toArray(function(err, data){ console.log(data); // it will print your collection data }) }); }); 

¿Estás seguro de que te has conectado al db? (Lo pregunto porque no veo un puerto especificado)

tratar:

 mongoose.connection.on("open", function(){ console.log("mongodb is connected!!"); }); 

Además, puede hacer un “show collections” en mongo shell para ver las colecciones dentro de su db. ¿Tal vez intente agregar un registro a través de mongoose y ver dónde termina?

Desde el aspecto de su cadena de conexión, debería ver el registro en la base de datos “de prueba”.

¡Espero eso ayude!

Otra cosa que no era obvia, al menos para mí, fue que al usar el tercer parámetro de Mongoose para evitar reemplazar la colección real con una nueva con el mismo nombre, el new Schema(...) es en realidad solo un marcador de posición, y no interfiere con el esquema existente por lo

 var User = mongoose.model('User', new Schema({ url: String, text: String, id: Number}, { collection : 'users' })); // collection name; User.find({}, function(err, data) { console.log(err, data, data.length);}); 

funciona bien y devuelve todos los campos, incluso si el esquema real (remoto) no contiene ninguno de estos campos. Mangosta todavía lo querrá como new Schema(...) , y una variable casi seguro no lo pirateará.