Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Trying to get a list of collections from mongoose

Tags:

I'm trying to return a list of a dbs collections using mongoose. I'm following the directions set out here but http://grokbase.com/t/gg/mongoose-orm/122xxxr7qy/mongoose-get-a-list-of-all-collections. So here is my code

var mongoose = require('mongoose');
    //if (mongoose.connection.readyState == 0){//checks if already connected to the database
    console.log("creating connection to the database");
    var Config = require('../configs/config');
    var config = new Config();
    config = config.getConfig().db.dev;

    if (mongoose.connection.readyState = 0 ) {
    mongoose.connect("mongodb://austin:[email protected]:10023/test1");
    console.log('mongoose readyState is ' + mongoose.connection.readyState);
    }
    var collection;

    mongoose.connection.on('open', function (ref) {
        console.log('Connected to mongo server.');
    });

    //trying to get collection names
    mongoose.connection.db.collectionNames(function (err, names) {
        console.log(names); // [{ name: 'dbname.myCollection' }]
        module.exports.Collection = names;
    });

the only problem is that names returns as undefined. So is it even possible to return a list of collections using just vanilla mongoose?

like image 270
Austin Davis Avatar asked Nov 13 '13 18:11

Austin Davis


People also ask

How does Mongoose know which collection?

Mongoose uses the model name, as passed when it was created: mongoose. model("User", UserSchema) , converted to lower case and with an 's' appended. For the model User it uses the collection users by default. You can change this by explicitly specifying the collection name in the schema.

Does Mongoose model create collection?

Mongoose by default does not create any collection for the model in the database until any documents are created.

Can Mongoose connect to multiple databases?

Mongoose doesn't allow to use multiple databases in single mongoose instance as the models are build on one connection.

What does Mongoose connect return?

The mongoose. createConnection() function takes the same arguments as mongoose. connect() and returns a new connection. const conn = mongoose.


4 Answers

Try running your collection names function after connection.

mongoose.connection.on('open', function (ref) {
    console.log('Connected to mongo server.');
    //trying to get collection names
    mongoose.connection.db.listCollections().toArray(function (err, names) {
        console.log(names); // [{ name: 'dbname.myCollection' }]
        module.exports.Collection = names;
    });
})
like image 27
Charlie Key Avatar answered Sep 19 '22 01:09

Charlie Key


Just came across this answer and though it may have worked at the time it appears collectionNames has been removed from the available function names in favour of listCollections

This other stack overflow post has a working example: https://stackoverflow.com/a/29461274/4127352

Here is the link to the original docs: http://mongodb.github.io/node-mongodb-native/2.0/meta/changes-from-1.0/

like image 144
Squivo Avatar answered Sep 20 '22 01:09

Squivo


Here is how I managed to obtain all the names on the connected db.

var mongoose = require('mongoose');
var collections = mongoose.connections[0].collections;
var names = [];

Object.keys(collections).forEach(function(k) {
    names.push(k);
});

console.log(names);

This solution works good on mongoose 4.4.19.

like image 39
Roger Avatar answered Sep 21 '22 01:09

Roger


I tried all the previous answers and didn't receive a positive result. But I have got the array of collections with this code:

  let listOfCollections = Object.keys(mongoose.connection.collections);
like image 36
Gabalyno Avatar answered Sep 20 '22 01:09

Gabalyno