create collection mongodb node.js express mongoose

mongodb - collection - mongoose virtual



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

¿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 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 "de prueba".

¡Espero eso ayude!

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


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 } ]


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


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á.


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

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


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