Selrac
Selrac

Reputation: 2293

MongoDB find and return all with max value

I'm trying to get a list of documents that have the max value. I can specify it if I know the number of documents with max value (like in the solution in this another stackoverflow solution 'mongodb how to get max value from collections'), but I don't know how to do it if I don't know what the number of documents is.

For example, using the following documents:

{name:"a", age:10}
{name:"b", age:11}
{name:"d", age:12}
{name:"c", age:12}

So I know that there are 2 documents with max age of 12. Therefore I can write the following query

db.collection.find().sort({age: -1).limit(2)

I use limit(2) because I know that there are 2 documents with a max value, but how can I automate that? Can I count the records with max value, store it in a variable and use it like limit(n)? Is there any other way to do it?

Upvotes: 6

Views: 9323

Answers (1)

profesor79
profesor79

Reputation: 9473

you can use aggregation framework to get results

var group = {$group:{_id:"$age", names:{$push:"$name"}, count:{$sum:1}}}
var sort = {$sort:{"_id":-1}}
var limit= {$limit:1}
db.selrac.aggregate([group, sort, limit])

and output looks like this:

{
    "_id" : 12.0,
    "names" : [ 
        "d", 
        "c"
    ],
    "count" : 2.0
}

or if there is a need to have full document reference replace group by this:

var group = {$group:{_id:"$age", fullDocument:{$push:"$$ROOT"}, count:{$sum:1}}}

output:

{
    "_id" : 12.0,
    "fullDocument" : [ 
        {
            "_id" : ObjectId("57509a890d4ae20f6de06657"),
            "name" : "d",
            "age" : 12.0
        }, 
        {
            "_id" : ObjectId("57509a890d4ae20f6de06658"),
            "name" : "c",
            "age" : 12.0
        }
    ],
    "count" : 2.0
}

Any comments welcome!

Upvotes: 7

Related Questions