问题
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?
回答1:
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!
来源:https://stackoverflow.com/questions/37601412/mongodb-find-and-return-all-with-max-value