Javascript 如何在mongoose中计算具有一个不同字段的记录?

Javascript 如何在mongoose中计算具有一个不同字段的记录?,javascript,node.js,nosql,mongoose,Javascript,Node.js,Nosql,Mongoose,在探索nodejs的mongoose时,我遇到了一个问题,需要知道我的收藏中的用户数量: 我的收藏有记录,每条记录都有一个用户。我想知道唯一(不同)用户的数量 我怎么能对猫鼬这样做 编辑: 数据库增长非常快,是否有办法从数据库中获取数字,而不是获取所有不同的记录并对其进行计数?您可以执行不同的查询 var Record = db.model('Record', yourSchema); Record.find().distinct('user').exec(callback); 猫鼬查询:

在探索nodejs的mongoose时,我遇到了一个问题,需要知道我的收藏中的用户数量:

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

我怎么能对猫鼬这样做

编辑:


数据库增长非常快,是否有办法从数据库中获取数字,而不是获取所有不同的记录并对其进行计数?

您可以执行不同的查询

var Record = db.model('Record', yourSchema);
Record.find().distinct('user').exec(callback);
猫鼬查询:

MongoDB独特查询:

这里有一个替代答案,因为我在Mongoose 3.1.2中尝试Reddest的方法时遇到了一个例外(在我看来,这似乎是Mongoose中的一个bug,因为Reddest的方法应该可以)

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

Record.distinct('user_id').exec(function (err, user_ids) {
    console.log('The number of unique users is: %d', user_ids.length);
});
或者,如果要从查找链接
distinct
调用,请在
distinct
调用中包含回调(这对我来说确实有效):

更新

如果只需要计数而不需要获取值,请在链中插入一个
count()
调用:

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

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

聚合将适用于您。诸如此类:

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

如果您只想获取查询集合的数量,可以使用以下方法:

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

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

这是我的解决方案

/**
 * Get number of distinct musicians
 */

myList.find()
    .distinct('musicianName')
    .exec(function (err, count) {
        console.log(count.length);
    });

看到我的更新了吗,有没有办法不拉入所有记录?@askmike当然,我刚刚添加了一个这样做的版本。事实上,我确认更新中提到的链接计数没有应用不同的过滤器。如果您检查查询输出,您将获得所有记录的计数(或您应用的任何过滤器)。@bromanko Yep,我明白您的意思。它在最新的代码中不起作用。请参阅我的更新,有没有办法不提取所有记录?为什么.distinct('phone').count()在最新的mongoose代码中不起作用?不确定这个解决方案,这样做,我总是得到1作为计数结果
/**
 * Get number of distinct musicians
 */

myList.find()
    .distinct('musicianName')
    .exec(function (err, count) {
        console.log(count.length);
    });