Node.js - Mongoose - Check if a collection exists Node.js - Mongoose - Check if a collection exists mongoose mongoose

Node.js - Mongoose - Check if a collection exists


Option 2 is probably the cleanest. Assuming you have a Mongoose Connection object named conn that's been opened using mongoose.createConnection, you can access the native mongo Db object via conn.db. From there you can call collectionNames which should provide what you're looking for:

conn.db.collectionNames(function (err, names) {    // names contains an array of objects that contain the collection names});

You can also pass a collection name as a parameter to collectionNames to filter the results to just what you're looking for.

Mongoose 4.x Update

In the 2.x version of the MongoDB native driver that Mongoose 4.x uses, collectionNames has been replaced by listCollections which accepts a filter and returns a cursor so you would do this as:

mongoose.connection.db.listCollections({name: 'mycollectionname'})    .next(function(err, collinfo) {        if (collinfo) {            // The collection exists        }    });


This works for me (mongoose version 5.1.1):

const mongoose = require('mongoose');const mongoURI = 'mongodb://localhost:27017/mydb'// notice the mongoose.createConnection instead of mongoose.connectconst conn = mongoose.createConnection(mongoURI);conn.on('open', function () {    conn.db.listCollections().toArray(function (err, collectionNames) {      if (err) {        console.log(err);        return;      }        console.log(collectionNames);        conn.close();    });});


Here's another option (with a little use of express, but I think it works fine without it) that worked for me. Suppose you imported a model. And, let's say Blog is the name of your model.

const app = express();const Blog = require('./models/blog');app.post('/example', (req, res) => {  Blog.findOne({name: 'collectionname'})  .then(result => {    if(result) {      //If it exists    }  })})

'''
The result is either null or object.