2

I have an array of objects in the following collection having levels i want only the top 3 levels from an array in descending order of levels

{
    "_id" : ObjectId("5ce10ffb0a9531d98ad11819"),
    "_course" : ObjectId("593107b273790c30c4e08b02"),
    "users" : [ 
        {
            "level" : 17,
            "_user" : ObjectId("5c08be10d1a0c91e4c739629")
        }, 
        {
            "level" : 16,
            "_user" : ObjectId("593107b273790c30c4e08b07")
        },
        {
            "level" : 5,
            "_user" : ObjectId("593107b273790c30c4e08b08")
        },
        {
            "level" : 17,
            "_user" : ObjectId("593107b273790c30c4e08b05")
        }
    ],
    "acr" : "MH"
}

/* 2 */
{
    "_id" : ObjectId("5ce10ffb0a9531d98ad1181a"),
    "_course" : ObjectId("593107b273790c30c4e08b02"),
    "users" : [ 
        {
            "level" : 9,
            "_user" : ObjectId("5c08be10d1a0c91e4c739629")
        }, 
        {
            "level" : 6,
            "_user" : ObjectId("593107b273790c30c4e08b02")
        },
        {
            "level" : 5,
            "_user" : ObjectId("593107b273790c30c4e08b07")
        },
        {
            "level" : 4,
            "_user" : ObjectId("593107b273790c30c4e08b07")
        }
    ],
    "acr" : "MA"
}

Expected output

  {
    "_id": "5ce10ffb0a9531d98ad11819",
    "users": [
      {
        "level": 17,
        "_user": "593107b273790c30c4e08b09"
      },
      {
        "level": 17,
        "_user": "593107b273790c30c4e08b05"
      },
      {
        "level": 16,
        "_user": "593107b273790c30c4e08b07"
      }
    ]
  },
  {
    "_id": "5ce10ffb0a9531d98ad11819",
    "users": [
      {
        "level": 9,
        "_user": "593107b273790c30c4e08b09"
      },
      {
        "level": 6,
        "_user": "593107b273790c30c4e08b02"
      },
      {
        "level": 5,
        "_user": "593107b273790c30c4e08b07"
      }
    ]
  }

I want the expected output like above i am using aggregation but i cant find a way. I used other way also but still i am not getting the proper output something is missing that i cant find

Ashh
  • 44,693
  • 14
  • 105
  • 132
Shubham Singh
  • 43
  • 1
  • 4

1 Answers1

4

You can use below aggregation

db.collection.aggregate([
  { "$unwind": "$users" },
  { "$sort": { "users.level": -1 }},
  { "$group": {
    "_id": "$_id",
    "users": { "$push": "$users" }
  }},
  { "$addFields": { "users": { "$slice": ["$users", 3] }}}
])

MongoPlayground

Ashh
  • 44,693
  • 14
  • 105
  • 132