While exploring mongoose for nodejs I ran into the problem of needing to know the amount of user in my collection:
My collection has records, each record has a user
You can do a distinct query.
var Record = db.model('Record', yourSchema);
Record.find().distinct('user').exec(callback);
Mongoose Queries: http://mongoosejs.com/docs/queries.html
MongoDB distinct query: http://www.mongodb.org/display/DOCS/Aggregation#Aggregation-Distinct
If you just want get the number of queried collections, you can use this:
Record.find()
.distinct('user_id')
.count(function (err, count) {
//The number of unique users is 'count'
});
Here's an alternative answer as I get an exception when I try Reddest's approach with Mongoose 3.1.2 (which seems like a bug in Mongoose to me as Reddest's approach should be fine).
You can call the distinct
method on your collection's model, specifying the name of the user-identifying field of that collection:
Record.distinct('user_id').exec(function (err, user_ids) {
console.log('The number of unique users is: %d', user_ids.length);
});
Or if you want to chain the distinct
call from a find, include the callback in the distinct
call (this did work for me):
Record.find().distinct('user_id', function (err, user_ids) { ... });
UPDATE
If you just want the count without getting the values, stick a count()
call in the chain:
Record.distinct('user_id').count().exec(function (err, count) {
console.log('The number of unique users is: %d', count);
});
NOTE: this doesn't work in the latest Mongoose code (3.5.2).
Aggregation will work for you. Something like that:
Transaction.aggregate(
{ $match: { seller: user, status: 'completed' } },
{ $group: { _id: '$customer', count: {$sum: 1} } }
).exec()
I just needed the number of distinct musicians, but some of the code above did not work for me. If I used count and distinct together I just got the total number.
This was my solution:
/**
* Get number of distinct musicians
*/
myList.find()
.distinct('musicianName')
.exec(function (err, count) {
console.log(count.length);
});