假设我有以下文件:
[
{
'_id': 1,
'roles': [
{
'k': 'free',
'v': 1
},
{
'k': 'pro',
'v': 5
},
{
'k': 'free',
'v': 2
}
]
},
{
'_id': 2,
'roles': [
{
'k': 'pro',
'v': 1
},
{
'k': 'free',
'v': 3
},
{
'k': 'free',
'v': 2
}
]
}
]
因此,对于每个_id
,我们都有一系列名为roles
的文档。
我需要使用roles
字段对数组v
进行排序。
预期输出:
[
{
'_id': 1,
'roles': [
{
'k': 'free',
'v': 1
},
{
'k': 'free',
'v': 2
}
{
'k': 'pro',
'v': 5
}
]
},
{
'_id': 2,
'roles': [
{
'k': 'pro',
'v': 1
},
{
'k': 'free',
'v': 2
}
{
'k': 'free',
'v': 3
}
]
}
]
所以我尝试使用$sort
:
{
'$sort': {
'roles.v': 1
}
}
但是它不会在数组内部排序。
答案 0 :(得分:2)
您需要$unwind
和$group
进行重建。
([
{ $unwind: "$roles" },
{ $sort: { "roles.v": 1 }},
{ $group: {
_id: "$_id",
roles: { $push: "$roles" }
}}
])
答案 1 :(得分:0)
为了按_id排序,如果需要$ project,这也将起作用。
db.getCollection("collectionName").aggregate([
{ $unwind: "$roles" },
{ $sort: { "roles.v": 1 }},
{ $group: {
_id: "$_id",
roles: { $push: "$roles" }
}},
{$project: {
_id: "$_id",
roles: "$roles"
}},
{$sort: {"_id": 1}}
])