简体   繁体   English

如何使用 Mongodb 中的聚合管道将文档数组分组到 arrays 的 arrays 中?

[英]How to group an array of documents to arrays of arrays using the aggregation pipeline in Mongodb?

I have the following set of documents,我有以下一组文件,

[
  {
    _id: new ObjectId("62f695063cf6055e6a50fd6d"),
    permissionGroupName: "User Management",
    permissionName: "Create User",
    __v: 0,
  },
  {
    _id: new ObjectId("62f695063cf6055e6a50fd6f"),
    permissionGroupName: "User Management",
    permissionName: "Edit User",
    __v: 0,
  },
  {
    _id: new ObjectId("62f695063cf6055e6a50fd71"),
    permissionGroupName: "User Management",
    permissionName: "Delete User",
    __v: 0,
  },
  {
    _id: new ObjectId("62f695073cf6055e6a50fd73"),
    permissionGroupName: "User Management",
    permissionName: "Approve User",
    __v: 0,
  },
  {
    _id: new ObjectId("62f8a73c79a839650a183182"),
    permissionGroupName: "Country Management",
    permissionName: "Approve Country",
    __v: 0,
  },
  {
    _id: new ObjectId("62f8a73c79a839650a183182"),
    permissionGroupName: "Advertisement Management",
    permissionName: "Create Advertisement",
    __v: 0,
  },
  {
    _id: new ObjectId("62f8a73c79a839650a183182"),
    permissionGroupName: "Advertisement Management",
    permissionName: "Delete Advertisement",
    __v: 0,
  },
  {
    _id: new ObjectId("62f8a73c79a839650a183182"),
    permissionGroupName: "University Management",
    permissionName: "Create University",
    __v: 0,
  },
  {
    _id: new ObjectId("62f8a73c79a839650a183182"),
    permissionGroupName: "University Management",
    permissionName: "Delete University",
    __v: 0,
  },
  {
    _id: new ObjectId("62f8a73c79a839650a183182"),
    permissionGroupName: "University Management",
    permissionName: "Approve University",
    __v: 0,
  },
  {
    _id: new ObjectId("62f8a73c79a839650a183182"),
    permissionGroupName: "Role Management",
    permissionName: "Approve Role",
    __v: 0,
  },
  {
    _id: new ObjectId("62f8a73c79a839650a183182"),
    permissionGroupName: "Role Management",
    permissionName: "Delete Role",
    __v: 0,
  },
  {
    _id: new ObjectId("62f8a73c79a839650a183182"),
    permissionGroupName: "Scholorship Management",
    permissionName: "Approve Scholorship",
    __v: 0,
  },
  {
    _id: new ObjectId("62f8a73c79a839650a183182"),
    permissionGroupName: "Post Management",
    permissionName: "Approve Post",
    __v: 0,
  },
  {
    _id: new ObjectId("62f8a73c79a839650a183182"),
    permissionGroupName: "Post Management",
    permissionName: "Delete Post",
    __v: 0,
  },
  {
    _id: new ObjectId("62f8a73c79a839650a183182"),
    permissionGroupName: "Student Management",
    permissionName: "Create Student",
    __v: 0,
  },
  {
    _id: new ObjectId("62f8a73c79a839650a183182"),
    permissionGroupName: "Teacher Management",
    permissionName: "Create Teacher",
    __v: 0,
  },
];

What I am trying to achieve我想要达到的目标

I am trying to transform it to the following form,我正在尝试将其转换为以下形式,

[
  [
    {
      permissions: [
        {
          name: "Create User",
          id: new ObjectId("62f695063cf6055e6a50fd6d"),
        },
        {
          name: "Edit User",
          id: new ObjectId("62f695063cf6055e6a50fd6f"),
        },
        {
          name: "Delete User",
          id: new ObjectId("62f695063cf6055e6a50fd71"),
        },
        {
          name: "Approve User",
          id: new ObjectId("62f695073cf6055e6a50fd73"),
        },
      ],
      permissionGroupName: "User Management",
    },
    {
      permissions: [
        {
          name: "Approve Country",
          id: new ObjectId("62f8a73c79a839650a183182"),
        },
      ],
      permissionGroupName: "Country Management",
    },
    {
      permissions: [
        {
          name: "Create Advertisement",
          id: new ObjectId("62f8a73c79a839650a183182"),
        },
        {
          name: "Delete Advertisement",
          id: new ObjectId("62f8a73c79a839650a183182"),
        },
      ],
      permissionGroupName: "Advertisement Management",
    },
    {
      permissions: [
        {
          name: "Create University",
          id: new ObjectId("62f8a73c79a839650a183182"),
        },
        {
          name: "Delete University",
          id: new ObjectId("62f8a73c79a839650a183182"),
        },
        {
          name: "Approve University",
          id: new ObjectId("62f8a73c79a839650a183182"),
        },
      ],
      permissionGroupName: "University Management",
    },
  ],
  [
    {
      permissions: [
        {
          name: "Approve Role",
          id: new ObjectId("62f8a73c79a839650a183182"),
        },
        {
          name: "Delete Role",
          id: new ObjectId("62f8a73c79a839650a183182"),
        },
      ],
      permissionGroupName: "Role Management",
    },
    {
      permissions: [
        {
          name: "Approve Scholorship",
          id: new ObjectId("62f8a73c79a839650a183182"),
        },
      ],
      permissionGroupName: "Scholorship Management",
    },
    {
      permissions: [
        {
          name: "Approve Post",
          id: new ObjectId("62f8a73c79a839650a183182"),
        },
        {
          name: "Delete Post",
          id: new ObjectId("62f8a73c79a839650a183182"),
        },
      ],
      permissionGroupName: "Post Management",
    },
    {
      permissions: [
        {
          name: "Delete Student",
          id: new ObjectId("62f8a73c79a839650a183182"),
        },
      ],
      permissionGroupName: "Student Management",
    },
  ],
  [
    {
      permissions: [
        {
          name: "Create Teacher",
          id: new ObjectId("62f8a73c79a839650a183182"),
        },
      ],
      permissionGroupName: "Teacher Management",
    },
  ],
];

As you can see the permissions are grouped by their group name and they have been set into arrays of objects, where each of the array containing four groups,如您所见,权限按组名分组,并且已设置为 arrays 对象,其中每个数组包含四个组,

For example it has the following format,例如,它具有以下格式,

[
    [
       {} <---- (1),
       {} <---- (2),
       {} <---- (3),
       {} <---- (4)
    ],
    [
       {} <---- (1),
       {} <---- (2),
       {} <---- (3),
       {} <---- (4)  
    ],
    [
       {} <---- (1)
    ]
]

See they are grouped into arrays of four.看到它们被分为四个 arrays。

What I currently have我目前拥有的

I have the following code,我有以下代码,

[
    {
      $group: {
        _id: "$permissionGroupName",
        permissions: {
          $push: {
            name: "$permissionName",
            id: "$_id",
          },
        },
      },
    },
    {
      $project: {
        permissionGroupName: "$_id",
        permissions: 1,
        _id: 0,
      },
    },
  ]

Which gives me,这给了我,

[
  {
    permissions: [
      {
        name: "Create User",
        id: new ObjectId("62f695063cf6055e6a50fd6d"),
      },
      {
        name: "Edit User",
        id: new ObjectId("62f695063cf6055e6a50fd6f"),
      },
      {
        name: "Delete User",
        id: new ObjectId("62f695063cf6055e6a50fd71"),
      },
      {
        name: "Approve User",
        id: new ObjectId("62f695073cf6055e6a50fd73"),
      },
    ],
    permissionGroupName: "User Management",
  },
  {
    permissions: [
      {
        name: "Approve Country",
        id: new ObjectId("62f8a73c79a839650a183182"),
      },
    ],
    permissionGroupName: "Country Management",
  },
  {
    permissions: [
      {
        name: "Create Advertisement",
        id: new ObjectId("62f8a73c79a839650a183182"),
      },
      {
        name: "Delete Advertisement",
        id: new ObjectId("62f8a73c79a839650a183182"),
      },
    ],
    permissionGroupName: "Advertisement Management",
  },
  {
    permissions: [
      {
        name: "Create University",
        id: new ObjectId("62f8a73c79a839650a183182"),
      },
      {
        name: "Delete University",
        id: new ObjectId("62f8a73c79a839650a183182"),
      },
      {
        name: "Approve University",
        id: new ObjectId("62f8a73c79a839650a183182"),
      },
    ],
    permissionGroupName: "University Management",
  },
  {
    permissions: [
      {
        name: "Approve Role",
        id: new ObjectId("62f8a73c79a839650a183182"),
      },
      {
        name: "Delete Role",
        id: new ObjectId("62f8a73c79a839650a183182"),
      },
    ],
    permissionGroupName: "Role Management",
  },
  {
    permissions: [
      {
        name: "Approve Scholorship",
        id: new ObjectId("62f8a73c79a839650a183182"),
      },
    ],
    permissionGroupName: "Scholorship Management",
  },
  {
    permissions: [
      {
        name: "Approve Post",
        id: new ObjectId("62f8a73c79a839650a183182"),
      },
      {
        name: "Delete Post",
        id: new ObjectId("62f8a73c79a839650a183182"),
      },
    ],
    permissionGroupName: "Post Management",
  },
  {
    permissions: [
      {
        name: "Delete Student",
        id: new ObjectId("62f8a73c79a839650a183182"),
      },
    ],
    permissionGroupName: "Student Management",
  },
  {
    permissions: [
      {
        name: "Create Teacher",
        id: new ObjectId("62f8a73c79a839650a183182"),
      },
    ],
    permissionGroupName: "Teacher Management",
  },
];

It gives me all the objects without grouping them into arrays of four.它给了我所有的对象,而没有将它们分组为四个 arrays。 Can someone please tell me how to proceed from here to get them into grouped into arrays of four?有人可以告诉我如何从这里开始将它们分成四个 arrays 吗?

What you ask for is not a valid mongoDB response, as mongoDB aggregation pipeline returns an array of documents (objects).您要求的不是有效的 mongoDB 响应,因为 mongoDB 聚合管道返回文档(对象)数组。 But you can get close to it.但是你可以靠近它。 Since mongoDB version 5.0 you can use $setWindowFields for this and add to your current query 3 more steps:由于 mongoDB 5.0 版,您可以为此使用$setWindowFields并在当前查询中添加 3 个以上步骤:

 {$setWindowFields: {
      sortBy: {nothing: 1},
      output: {
        index: { $sum: 1,
          window: {documents: ["unbounded",  "current"]}}
      }
    }
  },
  {$group: {
      _id: {$ceil: {$divide: ["$index", 4]}},
      data: {
        $push: {
          permissions: "$permissions",
          permissionGroupName: "$permissionGroupName"
        }
      }
  }},
  {$unset: "_id"}

See how it works on the playground example看看它在操场上的例子是如何工作的

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM