How to count records with one distinct field in mongoose?

后端 未结 5 1766
春和景丽
春和景丽 2021-01-12 10:30

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

相关标签:
5条回答
  • 2021-01-12 11:08

    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

    0 讨论(0)
  • 2021-01-12 11:12

    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'
          });
    
    0 讨论(0)
  • 2021-01-12 11:14

    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).

    0 讨论(0)
  • 2021-01-12 11:24

    Aggregation will work for you. Something like that:

    Transaction.aggregate(
        { $match: { seller: user, status: 'completed'  } }, 
        { $group: { _id: '$customer', count: {$sum: 1} } }
    ).exec() 
    
    0 讨论(0)
  • 2021-01-12 11:27

    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);
        });
    
    0 讨论(0)
提交回复
热议问题