MongoDB 使用 Node.js 获取集合中的文档数(计数)

Posted

技术标签:

【中文标题】MongoDB 使用 Node.js 获取集合中的文档数(计数)【英文标题】:MongoDB get the number of documents (count) in a collection using Node.js 【发布时间】:2014-10-17 21:07:03 【问题描述】:

我目前正在编写一个函数,它应该从集合中返回文档的数量,事情是当我返回它说未定义的值时,这是我的代码:

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

请帮帮我。

【问题讨论】:

您能告诉我们您收到的确切消息/错误吗? 这是一个错误,但我的变量应该得到文档的数量,而不是在控制台中显示:'ee is undefined' 不能返回异步函数调用的结果,必须使用回调。 你能给我看一些例子吗?我需要使用这个值来运行 for 循环 见这个:***.com/questions/14220321/…。这与 jQuery 中的 Ajax 调用相同。 【参考方案1】:

这是它应该的样子

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

及用法

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

请记住,如果您要多次调用此函数,最好只连接一次数据库,然后使用相同的连接。

【讨论】:

我已经这样做了,在使用中我添加了这个:var a = getNumOfDocs("stocks", host, port, dbName, function(err, count) if (err) return console.log(err.message); console.log('文档数', count); return count; ); console.log("a 是:" + a);我仍然得到一个未定义的 这很正常。 getNumOfDocs 的返回值是未定义的,里面的调用是异步的,这意味着它们不会立即完成,而是在稍后的时间点完成,因此无法像您一样返回值。【参考方案2】:

count() 自 mongodb 4.0 起已弃用。

相反,您应该使用 documentCount() 替代方案,但在处理大量数据时比 count() 慢得多。

替代方案是 estimatedDocumentCount(),它的表现相当不错,用法如下:

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

我使用的另一个选项是从 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);
        );
    ); 
 

【讨论】:

以上是关于MongoDB 使用 Node.js 获取集合中的文档数(计数)的主要内容,如果未能解决你的问题,请参考以下文章

Node.js REST API 从 MongoDB 获取数据

Node.JS、Express 和 MongoDB :: 多个集合

从Node JS中的MongoDB查询中获取数据

使用 mongoose(Node.js) 在 MongoDB 中搜索

如何从 MongoDB + Node.js + Mongoose 获取修改后的 json 输出

如何使用 mongodb (node.js) 在集合中创建一个包含所有值的数组