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

时间:2012-05-30 07:33:43

标签: node.js mongodb mongoose

如何知道数据已保存的模型数?有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是一个Object,调用哪个方法可以获得真正的count

感谢

8 个答案:

答案 0 :(得分:134)

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

以下是一个使用示例:

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

答案 1 :(得分:104)

以下代码有效。注意使用count。

 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.count({name: 'anand'}, function(err, c) {
           console.log('Count is ' + c);
      });
   }
 }); 

答案 2 :(得分:16)

不推荐使用collection.count,并且在以后的版本中将其删除。改为使用collection。 countDocuments 或collection。 estimatedDocumentCount

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

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

答案 3 :(得分:12)

您应该将对象作为参数

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

答案 4 :(得分:6)

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

Model.countDocuments(filterObject, callback)

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

Model.estimatedDocumentCount()

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

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

1)传递回调函数

例如,使用.countDocuments()对集合中的所有文档进行计数:

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

或者,使用.countDocuments()对具有特定名称的集合中的所有文档进行计数:

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

2)使用.then()

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

例如,使用.estimatedDocumentCount()对集合中的所有文档进行计数:

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

希望这会有所帮助!

答案 5 :(得分: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 );

答案 6 :(得分:0)

使用mongoose.js可以计数文档

const count = await Schema.countDocuments(); // count all

const count = await Schema.countDocuments({ key: value }); // count specific

答案 7 :(得分:-1)

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

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

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

如果要根据查询搜索文档数,可以执行以下操作:

 userModel.count({yourQueryGoesHere}, setNumberofDocuments);

setNumberofDocuments是一个separeted函数:

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


} 

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