如何获得猫鼬模型的所有计数?


101

我如何知道已保存数据的模型的数量?有一种方法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

谢谢


1
如果您使用的是ES 2016,则可以将调用包装在promise中计数,然后使用生成器进行调用。
mikeyGlitz '16

Answers:


125

下面的代码有效。注意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);
      });
   }
 }); 

150

您的代码无法正常工作的原因是因为count函数是异步的,因此不会同步返回值。

这是用法示例:

userModel.count({}, function( err, count){
    console.log( "Number of users:", count );
})

给我示例以获取计数同步方法的方法
sankar muniyappa

我也是。我正在寻找相同的东西
nowox

11
count方法已被描述,您可以使用countDocuments相同的语法
Kir Novak

@KirNovak谢谢兄弟。我还提供了猫鼬的网址以供弃用
Tes3awy

25

collection.count已过时,将在以后的版本中删除。使用集合。countDocuments或collection。estimatedDocumentCount代替。

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

    res.json({ count: count });
});


我遇到的问题是,在我们的项目中,设置例行程序会测试所有集合中的现有项目。count()方法的行为很奇怪:当集合不为空时,有时它什么也不返回(未定义,null,零或false-我们无法进一步研究)。我们仍然没有找到导致问题的原因,因为这是很少发生的比赛情况。现在,使用countDocuments({})对我们有用。谢谢!
ha110_b1mm3lbahn

UnhandledPromiseRejectionWarning: TypeError: userModel.countDocuments is not a function在我自己的userModel上使用它时出现错误?
路加·布朗

我们如何使“ userModel.countDocuments”作为同步调用,以便我可以向架构中添加一个虚拟对象,从而在文档中添加一些“键和值”。
萨蒂扬

25

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

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

要么

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

要么

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

在最新版本的猫鼬中,不建议使用count(),因此请使用

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

2
DeprecationWarning:不建议使用collection.count,而应改用.estimatedDocumentCount()或.countDocuments()。
HMagdy

9

解决方案的背景

如猫鼬文档和本杰明的答案中所述,该方法Model.count()已被弃用。除了使用count(),还可以使用以下替代方法:

Model.countDocuments(filterObject, callback)

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

Model.estimatedDocumentCount()

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

这两种方法都返回一个猫鼬查询对象,该对象可以通过以下两种方式之一执行。使用.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()

猫鼬查询具有.then()“ thenable”的功能。这是为了方便起见,查询本身并不是一个保证。

例如,使用来计数集合中的所有文档.estimatedDocumentCount()

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

选项3:使用异步/等待

使用异步/等待方法时,建议的方法是与它一起使用,.exec()因为它可以提供更好的堆栈跟踪。

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

通过堆栈溢出学习


1

投票得最高的答案是完全可以的,我只想累加await的使用,以便可以将要求的功能存档:

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

建议在'count()' 上使用countDocuments(),因为它将不推荐使用。因此,到目前为止,理想的代码是:

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

-1

如前所述,您的代码将无法正常运行。一种解决方案是使用回调函数,但是如果您认为它将带您进入“回调地狱”,则可以搜索“ Promisses”。

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

//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获取任何地方的Documents数量:

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

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

function calculateNumberOfDoc(someParameter, setNumberofDocuments){

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

       setNumberofDocuments(true);


} 

希望它可以帮助别人。:)


在函数calculateNumberOfDoc()中,为什么要调用setNumberofDocuments(true)?即使在返回实际计数之前,它也不会首先导致错误吗?
pravin 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.