使用每个对象内的值对对象数组进行排序(聚合框架)

时间:2020-05-13 12:35:40

标签: mongodb sorting aggregation-framework

假设我有以下文件:

[
  {
    '_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
  }
}

但是它不会在数组内部排序。

2 个答案:

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