assuming a dummy record looks like below
{
"_id": 1,
"Region": "North America",
"TotalSales": 200000,
"Countries": [
{
"name": "USA",
"sales": 150000
},
{
"name": "Canada",
"sales": 50000
},
{
"name": "Mexico",
"sales": 10000
},
{
"name": "Greenland",
"sales": 5000
},
{
"name": "Cuba",
"sales": 2000
},
{
"name": "Bahamas",
"sales": 1000
},
{
"name": "Jamaica",
"sales": 500
},
{
"name": "Haiti",
"sales": 200
},
{
"name": "Dominican Republic",
"sales": 100
}
]
}
and that you want to sort by country sales field you can use the $sortArray operator (version 5.2 onwards) inside $slice in the $project stage
db.collection.aggregate([
{
$project: {
Region: 1,
TotalSales: 1,
Countries: {
$slice: [
{
$sortArray: {
input: "$Countries",
sortBy: {
sales: 1
},
}
},
5
]
}
}
}
])
playground
if array doesn't have fields (something like ["UK","USA",..]) use
input: "$Countries",
sortBy: 1 //direction of sort
for versions 5.1 and below $sortArray doesn't work and you will have to go for a $unwind, $sort, $group, $push combo. see here
the query then will look like
db.collection.aggregate([
{
$unwind: "$Countries"
},
{
$sort: {
"Countries.sales": 1
}
},
{
$group: {
_id: "$_id",
Countries: {
$push: "$Countries"
},
Region: {
$first: "$Region"
},
TotalSales: {
$first: "$TotalSales"
}
}
},
{
$project: {
Region: 1,
TotalSales: 1,
Countries: {
$slice: [
"$Countries",
5
]
}
}
}
])
playground