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}}
])

是的,这很有魅力。谢谢你这么简单的方法!