【问题标题】:How to get number of documents using Mongoose?如何使用 Mongoose 获取文档数量?
【发布时间】:2015-06-14 11:29:52
【问题描述】:

我正在开发 Nodejs/Express/Mongoose 应用程序,我想通过增加记录文档的数量来实现自动增量 ID 功能,但我无法获得此计数,原因是 Mongoose 'count' 方法不返回数字:

var number = Model.count({}, function(count){ return count;});

有人设法得到计数吗?请帮忙。

【问题讨论】:

标签: node.js mongodb mongoose


【解决方案1】:

count 函数是异步的,它不会同步返回值。用法示例:

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

您也可以尝试在find() 之后链接它:

Model.find().count(function(err, count){
    console.log("Number of docs: ", count );
});

更新(节点:25093 - 弃用警告):

不推荐使用 count,您也可以完全按照使用“count”的方式使用“Collection.countDocuments”或“Collection.estimatedDocumentCount”。

更新:

正如@Creynders 所建议的,如果您尝试实现自动增量值,那么值得查看 mongoose-auto-increment 插件:

示例用法:

var Book = connection.model('Book', bookSchema);
Book.nextCount(function(err, count) {
 
    // count === 0 -> true 
 
    var book = new Book();
    book.save(function(err) {
 
        // book._id === 0 -> true 
 
        book.nextCount(function(err, count) {
 
            // count === 1 -> true 
 
        });
    });
});

【讨论】:

  • 它是这样工作的,但我想在一个变量中取回计数,以便我可以增加该变量:
  • @kaizer 了解 count 函数是异步的,并且可以随时完成,因此变量 number 在您访问它时将是未定义的。您只能使用 count 函数回调中的值。
  • @kaizer 看来您正在尝试实现自动增量值?您可以为此使用mongoose-auto-increment 插件。
  • @Creynders 你明白了,谢谢,我会试试并告诉你
【解决方案2】:

如果有人在 2019 年签出,count 将被弃用。请改用countDocuments

例子:

const count = await Model.countDocuments({ filterVar: parameter }); console.log(count);

【讨论】:

    【解决方案3】:

    如果您的收藏量很大,请使用Model.estimatedDocumentCount()。它比countcountDocuments 更快,因为它不会扫描整个集合。

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

    【讨论】:

      【解决方案4】:

      如果您使用的是 node.js >= 8.0 和 Mongoose >= 4.0,您应该使用 await

      const number = await Model.countDocuments();
      console.log(number);
      

      【讨论】:

        【解决方案5】:

        你必须等待回调函数

        Model.count({}, function(err , count){
          var number = count;
          console.log(number);
        });
        

        在 JavaScript 中

        setTimeout(function() {
          console.log('a');
        }, 0);
        
        console.log("b");
        

        “b”将在“a”之前打印 因为

        console.log('a')
        

        【讨论】:

          【解决方案6】:

          您似乎希望 var number 包含计数值。在您的回调函数中,您将返回 count,但这是异步执行的,因此不会将值分配给任何内容。

          另外,回调函数中的第一个参数应该是err

          例如:

          var number = Model.count({}, function(err, count) {
              console.log(count); // this will print the count to console
          });
          
          console.log(number); // This will NOT print the count to console
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-07-12
            • 2019-09-12
            • 1970-01-01
            • 2017-01-29
            • 1970-01-01
            • 2014-04-30
            相关资源
            最近更新 更多