152 votes

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

Donc, j'ai une grande collection de 300 question objets dans une base de données test. Je peux interagir avec cette collection facilement par le biais de MongoDB shell interactif; cependant, lorsque j'essaie d'obtenir de la collecte par le biais de la Mangouste dans un express.js demande-je obtenir un tableau vide.

Ma question est, comment puis-je accéder à ce déjà existant dataset au lieu de recréer dans l'express? Voici un code:

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

Ce sorties:

null [] 0

269voto

calvinfo Points 596

Mongoose a ajouté la possibilité de spécifier le nom de la collection sous le schéma ou en tant que 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 schema-mapped:

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

ou modèle mappé:

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

64voto

Michael Taufen Points 454

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

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

faites simplement find(collection_name, query, callback); pour obtenir le résultat.

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

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

17voto

Will Nathan Points 253

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 indiquer l'endroit où vous ajouteriez une telle contrainte:

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

7voto

busticated Points 917

Êtes-vous sûr que vous êtes connecté à la base de données? (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 un shell mongo pour voir les collections dans votre base de données - peut-être essayer d’ajouter un enregistrement via mangouste et voir où il se termine?

À partir de l'apparence de votre chaîne de connexion, vous devriez voir l'enregistrement dans la base de données "test".

J'espère que ça aide!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X