5

I'm currently writing a function that should return the number of documents from a collection the thing is that when i'm returning the value it says undefined, Here is my code:

    var MongoClient = require('mongodb').MongoClient;


// open the connection the DB server
var dbName = "ystocks";
var port = "27017";
var host = "localhost";
var tt = "mongodb://" + host + ":" + port + "/" + dbName;
//"mongodb://localhost:27017/ystocks"
function getNumOfDocs (collectionName, host, port, dbName) {
    var tt = "mongodb://" + host + ":" + port + "/" + dbName;
    count = 0;
    MongoClient.connect(tt, function (error, db){

        if(error) throw error;
        collectionName = collectionName;
        db.collection(collectionName).count({}, function(error, numOfDocs){
            if (error) throw error;

            //print the result
            console.dir("numOfDocs: " + numOfDocs);
            count = numOfDocs;
            console.log("count is : " + count);

            // close the DB
            return numOfDocs;
            db.close();


        });// end of count

    }); // Connection to the DB
    //return count;

} // end of getNumOfDocs


var ee = getNumOfDocs ("stocks", "localhost", "27017", "ystocks");
console.log("ee is " + ee);

Please help me.

Community
  • 1
  • 1
Alex Brodov
  • 3,365
  • 18
  • 43
  • 66

2 Answers2

7

Here is how it should look like

var MongoClient = require('mongodb').MongoClient;

var dbName = "ystocks";
var port = "27017";
var host = "localhost";

function getNumOfDocs (collectionName, host, port, dbName, callback) {
    MongoClient.connect("mongodb://" + host + ":" + port + "/" + dbName, function (error, db){
        if(error) return callback(error);

        db.collection(collectionName).count({}, function(error, numOfDocs){
            if(error) return callback(error);

            db.close();
            callback(null, numOfDocs);
        });
    }); 
} 

And usage

getNumOfDocs("stocks", host, port, dbName, function(err, count) {
   if (err) {
       return console.log(err.message);
   }
   console.log('number of documents', count);
});

Keep in mind if you are going to call this function lots of times, it is better to just connect to the database once and then use the same connection.

Barış Uşaklı
  • 13,440
  • 7
  • 40
  • 66
  • I've done this and in the usage i've added this : var a = getNumOfDocs("stocks", host, port, dbName, function(err, count) { if (err) { return console.log(err.message); } console.log('number of documents', count); return count; }); console.log("a is :" + a); I'm still getting a is undefined – Alex Brodov Aug 24 '14 at 17:26
  • That is normal. The return value of getNumOfDocs is undefined, the calls inside are async, meaning they don't complete immediately but at a later point in time so there is no way to return a value like you do. – Barış Uşaklı Aug 24 '14 at 18:43
3

The use of count() is deprecated since mongodb 4.0.

Instead you should use documentCount() alternative, but is much moere slower than count() with large ammounts of data.

The alternatives are estimatedDocumentCount() that performs quite well and the usage is:

var MongoClient = require('mongodb').MongoClient;

var dbName = "ystocks";
var port = "27017";
var host = "localhost";

function getNumOfDocs (collectionName, host, port, dbName, callback) {
    MongoClient.connect("mongodb://" + host + ":" + port + "/" + dbName, function (error, db){
        if(error) return callback(error);

        db.collection(collectionName).estimatedDocumentCount({}, function(error, numOfDocs){
            if(error) return callback(error);

            db.close();
            callback(null, numOfDocs);
        });
    }); 
} 

Another option I use is to get the number of documents from the collection stats:

var MongoClient = require('mongodb').MongoClient;

var dbName = "ystocks";
var port = "27017";
var host = "localhost";

function getNumOfDocs (collectionName, host, port, dbName, callback) {
    MongoClient.connect("mongodb://" + host + ":" + port + "/" + dbName, function (error, db){
        if(error) return callback(error);

        db.collection(collectionName).stats(function(error, stats){
            if(error) return callback(error);

            db.close();
            callback(null, stats.count);
        });
    }); 
}