【发布时间】:2012-09-09 05:10:40
【问题描述】:
在为 nodejs 探索 mongoose 时,我遇到了需要知道我的集合中用户数量的问题:
我的收藏有记录,每条记录都有一个用户。我想知道唯一(不同)用户的数量。
我怎样才能用猫鼬做到这一点?
编辑:
数据库增长很快,有没有办法从数据库中取回数字而不是获取所有不同的记录并计算它们?
【问题讨论】:
标签: javascript node.js nosql mongoose
在为 nodejs 探索 mongoose 时,我遇到了需要知道我的集合中用户数量的问题:
我的收藏有记录,每条记录都有一个用户。我想知道唯一(不同)用户的数量。
我怎样才能用猫鼬做到这一点?
编辑:
数据库增长很快,有没有办法从数据库中取回数字而不是获取所有不同的记录并计算它们?
【问题讨论】:
标签: javascript node.js nosql mongoose
这是一个替代答案,因为当我在 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) 中不起作用。
【讨论】:
聚合将为您工作。类似的东西:
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'
});
【讨论】:
您可以执行不同的查询。
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
【讨论】:
我只需要不同音乐家的数量,但一些上面的代码不适合我。如果我同时使用 count 和 distinct 我就得到了总数。
这是我的解决方案:
/**
* Get number of distinct musicians
*/
myList.find()
.distinct('musicianName')
.exec(function (err, count) {
console.log(count.length);
});
【讨论】:
我正在寻找答案并得到了这个问题,现在我得到了答案,所以回复了这个问题。
您可以使用以下代码隔离所有具有相似属性的用户。我以电子邮件为例,您可以更改它。您还将获得与您选择的属性值相同的所有用户的计数。
var agg = [{$group: {_id: "$email",total: {$sum: 1}}}];
User.aggregate(agg, function(err, logs){
if (err) { return console.log(err); }
return console.log(logs);
});
【讨论】: