web-dev-qa-db-fra.com

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

J'ai une grande collection de 300 question objets dans une base de données test. Je peux facilement interagir 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 ensemble de données 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: String, text: String, id: Number }));

var questions = mongoose.model('question');
questions.find({}, function(err, data) { console.log(err, data, data.length); });

Cela génère:

null [] 0
118
theabraham

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-mappé:

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
227
calvinfo

Voici une abstraction de la réponse de Will Nathan si quelqu'un souhaite 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);
   });
}

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 } ]
57
Michael Taufen

Vous pouvez faire quelque chose comme ceci, pour accéder aux fonctions natives de mongodb dans mangouste:

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

});
19
Leo Ribeiro

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);
14
Will Nathan

Ê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 mongo Shell pour voir les collections dans votre base de données - peut-être essayer d’ajouter un disque 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!

6
busticated

Une autre chose qui n’était pas évidente, du moins pour moi, était que lorsque vous utilisiez le troisième paramètre de Mongoose pour éviter de remplacer la collection réelle par un nouveau du même nom, la new Schema(...) n’est en réalité qu’un espace réservé, et ne pas interférer avec le schéma existant si

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

fonctionne correctement et renvoie tous les champs - même si le schéma (distant) actuel ne contient aucun de ces champs. Mongoose le voudra toujours sous la forme new Schema(...), et une variable ne le piratera certainement pas.

2
Bart