按 MongoDB 中的键对子文档数组进行分组

弗兰基

是否可以使用 MongoDB 的聚合框架使用文件夹键对通道进行分组,而无需加入文档?

[{key: 1, channels: {A: [], B: [], etc}}, {key: 2, channels: {A: [], B: [], etc}}]

我正在尝试使用$unwind然后$group按文件夹名称,但似乎不可能。

蒙戈游乐场

文件:

[
  {
    key: 1,
    channels: [
      {
        "id": 1,
        "name": "XXX",
        "folder": "C"
      },
      {
        "id": 2,
        "name": "XXX",
        "folder": "A"
      },
      {
        "id": 3,
        "name": "XXX",
        "folder": "B"
      },
      {
        "id": 4,
        "name": "XXX",
        "folder": "A"
      },
      {
        "id": 5,
        "name": "XXX",
        "folder": "B"
      },
      {
        "id": 6,
        "name": "XXX",
        "folder": "C"
      }
    ]
  },
  {
    key: 2,
    channels: [
      {
        "id": 1,
        "name": "XXX",
        "folder": "D"
      },
      {
        "id": 2,
        "name": "XXX",
        "folder": "B"
      },
      {
        "id": 3,
        "name": "XXX",
        "folder": "A"
      },
      {
        "id": 4,
        "name": "XXX",
        "folder": "C"
      },
      {
        "id": 5,
        "name": "XXX",
        "folder": "A"
      },
      {
        "id": 6,
        "name": "XXX",
        "folder": "D"
      }
    ]
  }
]

预期结果:

[
  {
    key: 1,
    channels: {
      A: [{
        "id": 2,
        "name": "XXX"
      },{
        "id": 4,
        "name": "XXX"
      }],
      B: [{
        "id": 3,
        "name": "XXX"
      }, {
        "id": 5,
        "name": "XXX"
      }],
      C: [{
         "id": 1,
        "name": "XXX"
      },{
        "id": 6,
        "name": "XXX"
      }]
    }
  },
  {
    "key": 2,
    "channels": ...

  }
]

非常感谢您提前。

土生土长的
  • $group通过keyfolderchannels通过提供必填字段来构造数组
  • $groupby onlykeychannels以 key-vlaue 格式构造数组
  • $arrayToObject将上面构造的转换channels为对象
db.collection.aggregate([
  { $match: { key: { $in: [1, 2] } } },
  { $unwind: "$channels" },
  {
    $group: {
      _id: {
        id: "$key",
        folder: "$channels.folder"
      },
      channels: {
        $push: {
          id: "$channels.id",
          name: "$channels.name"
        }
      }
    }
  },
  {
    $group: {
      _id: "$_id.id",
      channels: {
        $push: {
          k: "$_id.folder",
          v: "$channels"
        }
      }
    }
  },
  { $project: { channels: { $arrayToObject: "$channels" } } }
])

操场

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章