Shaik Mujahid Ali
Shaik Mujahid Ali

Reputation: 2378

Get Distinct Document by Max Value of a Field

I have a requirement where i should query on two fields out of which one is unique field and one is maximum field. Here is my sample collection

 {
    "_id": ObjectId('59537b7fe08062b9ee8dfdf6'),
    "admin": {
        "model": "abc",
        "version": "00",
        "name":"john",
        "age":"30"
    }
}
{
    "_id": ObjectId('59537b7fe08062b9ee8dfdf7'),
    "admin": {
        "model": "abc",
        "version": "01" ,
        "name":"john",
        "age":"30"
    }
}
{
    "_id": ObjectId('59537b7fe08062b9ee8dfdf8'),
    "admin": {
        "model": "def",
        "version": "00" ,
        "name":"cena",
        "age":"30"
    }
}

I have two same models with different versions.I want to query for model with maximum version. I tried by simply sorting the version it does not work for me. I am expecting output like this

{
    "_id": ObjectId('59537b7fe08062b9ee8dfdf7'),
    "admin": {
        "model": "abc",
        "version": "01" ,
        "name":"john",
        "age":"30"
    }
}
{
    "_id": ObjectId('59537b7fe08062b9ee8dfdf8'),
    "admin": {
        "model": "def",
        "version": "00" ,
        "name":"cena",
        "age":"30"
    }
} 

Any suggestions will be really helpful.

Upvotes: 0

Views: 539

Answers (1)

Alex Blex
Alex Blex

Reputation: 37018

As Neil said, it is $sort, $group, and $replaceRoot, but with correct values in the query:

db.collection.aggregate([
  { "$sort": { "admin.version": -1 } },
  { "$group": {
    "_id": "$admin.model" ,
    "admin": { "$first": "$$ROOT" }
  }},
  { "$replaceRoot": { "newRoot": "$admin" } }
])

Upvotes: 2

Related Questions