Comment accéder à une collection préexistante avec Mongoose?

J’ai une grande collection de 300 objects de question dans un test firebase database. Je peux interagir facilement avec cette collection grâce au shell interactif de MongoDB; Cependant, lorsque j’essaie d’obtenir la collection via Mongoose dans une application express.js, je reçois un tableau vide.

Ma question est la suivante: comment puis-je accéder à cet dataset déjà existant au lieu de le recréer dans express? Voici un code:

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

Cela produit:

 null [] 0 

Mongoose a ajouté la possibilité de spécifier le nom de la collection sous le schéma ou le troisième argument lors de la déclaration du modèle. Sinon, il utilisera la version plurielle donnée par le nom que vous associez au modèle.

Essayez quelque chose comme ce qui suit, soit schématisé:

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

ou modèle mappé:

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

Voici une abstraction de la réponse de Will Nathan si quelqu’un veut simplement une fonction complémentaire copier-coller:

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

il suffit de find(collection_name, query, callback); être donné le résultat.

Par exemple, si j’ai un document {a: 1} dans une collection ‘foo’ et que je veux répertorier ses propriétés, je le fais:

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

J’ai eu le même problème et j’ai pu exécuter une requête sans schéma en utilisant une connexion Mongoose existante avec le code ci-dessous. J’ai ajouté une contrainte simple ‘a = b’ pour montrer où vous appendiez une telle contrainte:

 var action = function (err, collection) { // Locate all the ensortinges 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); 

Vous pouvez faire quelque chose comme ça, vous aurez access aux fonctions mongodb natives dans 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 }) }); }); 

Êtes-vous sûr d’avoir connecté à la firebase database? (Je demande parce que je ne vois pas de port spécifié)

essayer:

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

En outre, vous pouvez faire un “show collections” dans mongo shell pour voir les collections de votre firebase database – peut-être essayer d’append un enregistrement via mongoose et voir où il se termine?

De l’apparence de votre chaîne de connexion, vous devriez voir l’enregistrement dans la firebase database “test”.

J’espère que cela aide!

Autre chose qui n’était pas évidente, du moins pour moi, lors de l’utilisation du troisième paramètre de Mongoose pour éviter de remplacer la collection par une nouvelle avec le même nom, le new Schema(...) n’est en fait qu’un espace réservé, et n’interfère pas avec le schéma existant pour

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

fonctionne correctement et renvoie tous les champs – même si le schéma (distant) ne contient aucun de ces champs. Mongoose le voudra toujours comme new Schema(...) , et une variable ne le fera certainement pas.