127

我如何知道已保存数据的模型的数量?有一种方法Model.count(),但它似乎不起作用。

var db = mongoose.connect('mongodb://localhost/myApp');
var userSchema = new Schema({name:String,password:String});
userModel =db.model('UserList',userSchema);        
var userCount = userModel.count('name');

userCount是一个对象,调用哪个方法可以得到一个真实的count

谢谢

4

9 回答 9

164

您的代码不起作用的原因是 count 函数是异步的,它不会同步返回值。

这是一个使用示例:

userModel.count({}, function( err, count){
    console.log( "Number of users:", count );
})
于 2013-03-26T12:14:45.783 回答
151

下面的代码有效。注意countDocuments的使用。

 var mongoose = require('mongoose');
 var db = mongoose.connect('mongodb://localhost/myApp');
 var userSchema = new mongoose.Schema({name:String,password:String});
 var userModel =db.model('userlists',userSchema);
 var anand = new userModel({ name: 'anand', password: 'abcd'});
 anand.save(function (err, docs) {
   if (err) {
       console.log('Error');
   } else {
       userModel.countDocuments({name: 'anand'}, function(err, c) {
           console.log('Count is ' + c);
      });
   }
 }); 
于 2012-05-30T10:22:18.360 回答
37

你应该给一个对象作为参数

userModel.countDocuments({name: "sam"});

或者

userModel.countDocuments({name: "sam"}).exec(); //if you are using promise

或者

userModel.countDocuments({}); // if you want to get all counts irrespective of the fields

对于旧版本的猫鼬,请使用

userModel.count({name: "sam"});
于 2017-04-25T07:10:08.660 回答
29

collection.count 已弃用,并将在未来版本中删除。使用收藏。countDocuments或集合。而是估计的DocumentCount。

userModel.countDocuments(query).exec((err, count) => {
    if (err) {
        res.send(err);
        return;
    }

    res.json({ count: count });
});
于 2018-08-18T00:55:29.440 回答
22

解决方案的背景

正如猫鼬文档和本杰明的回答中所述,该方法Model.count()已被弃用。代替 using count(),替代方案如下:

Model.countDocuments(filterObject, callback)

计算有多少文档与集合中的过滤器匹配。传递一个空对象 {} 作为过滤器会执行完整的集合扫描。如果集合很大,可以使用以下方法。

Model.estimatedDocumentCount()

此模型方法估计 MongoDB 集合中的文档数。这种方法比以前的方法更快countDocuments(),因为它使用集合元数据而不是遍历整个集合。但是,正如方法名称所暗示的那样,并且根据数据库配置,结果是估计值,因为元数据可能无法反映方法执行时刻集合中文档的实际数量。

两种方法都返回一个 mongoose 查询对象,可以通过以下两种方式之一执行。.exec()如果您想稍后执行查询,请使用。

解决方案

选项 1:传递回调函数

例如,使用以下方法计算集合中的所有文档.countDocuments()

someModel.countDocuments({}, function(err, docCount) {
    if (err) { return handleError(err) } //handle possible errors
    console.log(docCount)
    //and do some other fancy stuff
})

或者,使用以下方法计算集合中具有特定名称的所有文档.countDocuments()

someModel.countDocuments({ name: 'Snow' }, function(err, docCount) {
    //see other example
}

选项 2:使用.then()

mongoose查询具有.then()“thenable”。这是为了方便,查询本身并不是一个承诺。

例如,使用以下方法计算集合中的所有文档.estimatedDocumentCount()

someModel
    .estimatedDocumentCount()
    .then(docCount => {
        console.log(docCount)
        //and do one super neat trick
    })
    .catch(err => {
        //handle possible errors
    })

选项 3:使用 async/await

当使用 async/await 方法时,推荐的方法是使用它,.exec()因为它提供了更好的堆栈跟踪。

const docCount = await someModel.countDocuments({}).exec();

通过stackoverflow学习,

于 2018-10-31T14:21:06.277 回答
9

使用 mongoose.js 你可以统计文档,

  • 全部计算
const count = await Schema.countDocuments();
  • 具体计数
const count = await Schema.countDocuments({ key: value });
于 2020-08-27T07:49:44.807 回答
4

这里投票最高的答案非常好我只想加起来await的使用,以便可以实现所要求的功能:

const documentCount = await userModel.count({});
console.log( "Number of users:", documentCount );

建议使用countDocuments()而不是 'count()',因为它将被弃用。所以,就目前而言,完美的代码是:

const documentCount = await userModel.countDocuments({});
console.log( "Number of users:", documentCount );
于 2020-01-02T05:34:22.600 回答
1

Model.count()方法在 mongoose 版本 6.2.0 中已弃用。如果要计算集合中的文档数,例如count({}),请改用该estimatedDocumentCount()函数。否则,请改用该countDocuments()功能。

Model.estimatedDocumentCount()估计 MongoDB 集合中的文档数。它比countDocuments()用于大型集合更快,因为estimatedDocumentCount() 使用集合元数据而不是扫描整个集合。

例子:

const numAdventures = await Adventure.estimatedDocumentCount();

参考:https ://mongoosejs.com/docs/api.html#model_Model.estimatedDocumentCount

于 2022-02-05T04:06:06.703 回答
-1

如前所述,您的代码将无法正常工作。解决方案是使用回调函数,但如果您认为它会将您带入“回调地狱”,您可以搜索“Promises”。

使用回调函数的可能解决方案:

//DECLARE  numberofDocs OUT OF FUNCTIONS
     var  numberofDocs;
     userModel.count({}, setNumberofDocuments); //this search all DOcuments in a Collection

如果要根据查询搜索文档数,可以这样做:

 userModel.count({yourQueryGoesHere}, setNumberofDocuments);

setNumberofDocuments 是一个单独的函数:

var setNumberofDocuments = function(err, count){ 
        if(err) return handleError(err);

        numberofDocs = count;

      };

现在您可以使用 getFunction 在任何地方获取文档的数量:

     function getNumberofDocs(){
           return numberofDocs;
        }
 var number = getNumberofDocs();

此外,您可以通过回调在同步函数中使用此异步函数,例如:

function calculateNumberOfDoc(someParameter, setNumberofDocuments){

       userModel.count({}, setNumberofDocuments); //this search all DOcuments in a Collection

       setNumberofDocuments(true);


} 
于 2014-07-17T16:07:41.227 回答