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


Tengo una gran colección de 300 question objetos en una base de datos test. Puedo interactuar con esta colección fácilmente a través del shell interactivo de MongoDB; sin embargo, cuando intento obtener la colección a través de Mangosta en un expreso.aplicación 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
Author: Talha Awan, 2011-04-26

6 answers

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 pluralizada dada por el nombre que asigna al modelo.

Intente algo como lo siguiente, ya sea mapeado con 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
 201
Author: calvinfo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-03 15:21:05

Aquí hay una abstracción de la respuesta de Will Nathan si alguien solo quiere una función de complemento 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 haga find(collection_name, query, callback); para obtener 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 } ]
 48
Author: Michael Taufen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-16 01:21:18

Tuve el mismo problema y pude ejecutar una consulta sin esquema utilizando una conexión Mongoose existente con el código de abajo. He agregado una restricción simple 'a = b'para mostrar dónde agregaría dicha 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);
 13
Author: Will Nathan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-06 15:20:44

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
        })
    });

});
 12
Author: Leo Ribeiro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-25 01:28:50

¿Está seguro de que se ha conectado a la base de datos? (Pregunto porque no veo un puerto especificado)

Intenta:

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

También, puede hacer un "mostrar colecciones" en mongo shell para ver las colecciones dentro de su base de datos - tal vez intente agregar un registro a través de mangosta y ver dónde termina?

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

Espero que ayude!

 5
Author: busticated,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-27 02:55:12

Algo más que no era obvio, al menos para mí, fue que cuando se usa el tercer parámetro de Mangosta 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 que

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 quiere como new Schema(...), y una variable casi seguramente no lo hackeará.

 1
Author: Bart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-20 16:44:09