Mongodb 使用每个对象内的值对对象数组进行排序(聚合框架)
假设我有以下文件:Mongodb 使用每个对象内的值对对象数组进行排序(聚合框架),mongodb,sorting,aggregation-framework,Mongodb,Sorting,Aggregation Framework,假设我有以下文件: [ { '_id': 1, 'roles': [ { 'k': 'free', 'v': 1 }, { 'k': 'pro', 'v': 5 }, { 'k': 'free', 'v': 2 } ] }, { '_id': 2, 'roles': [
[
{
'_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
}
]
}
]
因此,对于每个\u id
,我们都有一个名为角色的文档数组
我需要使用v
字段在数组roles
中进行排序
预期输出:
[
{
'_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
}
}
但是它不会在数组内部排序。您需要$unwind
和$group
来重建
([
{ $unwind: "$roles" },
{ $sort: { "roles.v": 1 }},
{ $group: {
_id: "$_id",
roles: { $push: "$roles" }
}}
])
为了按_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}}
])
是的,这很有魅力。谢谢你这么简单的方法!