【问题标题】:How to count records with one distinct field in mongoose?如何计算猫鼬中具有一个不同字段的记录?
【发布时间】:2012-09-09 05:10:40
【问题描述】:

在为 nodejs 探索 mongoose 时,我遇到了需要知道我的集合中用户数量的问题:

我的收藏有记录,每条记录都有一个用户。我想知道唯一(不同)用户的数量。

我怎样才能用猫鼬做到这一点?

编辑:

数据库增长很快,有没有办法从数据库中取回数字而不是获取所有不同的记录并计算它们?

【问题讨论】:

    标签: javascript node.js nosql mongoose


    【解决方案1】:

    这是一个替代答案,因为当我在 Mongoose 3.1.2 中尝试 Reddest 的方法时出现异常(这对我来说似乎是 Mongoose 中的一个错误,因为 Reddest 的方法应该没问题)。

    您可以在集合的模型上调用distinct 方法,指定该集合的用户标识字段的名称:

    Record.distinct('user_id').exec(function (err, user_ids) {
        console.log('The number of unique users is: %d', user_ids.length);
    });
    

    或者,如果您想从 find 中链接 distinct 调用,请在 distinct 调用中包含回调(这对我有用):

    Record.find().distinct('user_id', function (err, user_ids) { ... });
    

    更新

    如果您只想要计数而不获取值,请在链中调用count()

    Record.distinct('user_id').count().exec(function (err, count) {
        console.log('The number of unique users is: %d', count);
    });
    

    注意:这在最新的 Mongoose 代码 (3.5.2) 中不起作用。

    【讨论】:

    • 查看我的更新,有没有办法不拉入所有记录?
    • @askmike 当然,我刚刚添加了一个版本。
    • 实际上,我确认更新中提到的链接计数确实应用了不同的过滤器。如果您检查查询输出,您将获得所有记录的计数(或您应用的任何过滤器)。
    • @bromanko 是的,我明白你的意思。它在最新的代码中不起作用。
    【解决方案2】:

    聚合将为您工作。类似的东西:

    Transaction.aggregate(
        { $match: { seller: user, status: 'completed'  } }, 
        { $group: { _id: '$customer', count: {$sum: 1} } }
    ).exec() 
    

    【讨论】:

    • 为什么 .distinct('phone').count() 在最新的 mongoose 代码中不起作用?
    【解决方案3】:

    如果你只想获取查询集合的数量,你可以使用这个:

    Record.find()
          .distinct('user_id')
          .count(function (err, count) {
              //The number of unique users is 'count'
          });
    

    【讨论】:

    • 不确定这个解决方案,这样做,我总是得到 1 作为计数结果
    【解决方案4】:

    您可以执行不同的查询。

    var Record = db.model('Record', yourSchema);
    Record.find().distinct('user').exec(callback);
    

    猫鼬查询: http://mongoosejs.com/docs/queries.html

    MongoDB 不同的查询: http://www.mongodb.org/display/DOCS/Aggregation#Aggregation-Distinct

    【讨论】:

    • 查看我的更新,有没有办法不拉入所有记录?
    【解决方案5】:

    我只需要不同音乐家的数量,但一些上面的代码不适合我。如果我同时使用 count 和 distinct 我就得到了总数。

    这是我的解决方案

    /**
     * Get number of distinct musicians
     */
    
    myList.find()
        .distinct('musicianName')
        .exec(function (err, count) {
            console.log(count.length);
        });
    

    【讨论】:

      【解决方案6】:

      我正在寻找答案并得到了这个问题,现在我得到了答案,所以回复了这个问题。

      您可以使用以下代码隔离所有具有相似属性的用户。我以电子邮件为例,您可以更改它。您还将获得与您选择的属性值相同的所有用户的计数。

      var agg = [{$group: {_id: "$email",total: {$sum: 1}}}];
      User.aggregate(agg, function(err, logs){
        if (err) { return console.log(err); }
        return console.log(logs);
      });
      

      【讨论】:

        猜你喜欢
        • 2017-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-14
        • 1970-01-01
        • 1970-01-01
        • 2022-01-25
        相关资源
        最近更新 更多