MongoDB聚合:如何将查找结果放入嵌套数组中?

lpwwtiir  于 2022-11-03  发布在  Go
关注(0)|答案(1)|浏览(217)

我尝试聚合以下文档,以将参与者作为嵌套数组中的对象。

{
  "name": "EXAMPLE",
  "schedules": [
    {
      "schedule_id":  "id1",
      "participants": [
      "participant_id1",
      "participant_id2"
      ],
    },
    {
      "schedule_id": "id2",
      "participants": [
        "participant_id1",
        "participant_id2"
      ],
    },
    {
      "schedule_id": "id3",
      "participants": [
        "participant_id1"
      ],
    },
  ],
}

因此,我编写了以下Pipeline:

[
  {
    $unwind: {
      path: "$schedules",
      includeArrayIndex: "index",
      preserveNullAndEmptyArrays: true,

    }
  },
  {
    $unwind: {
      path: "$schedules.participants",
      includeArrayIndex: "index",
      preserveNullAndEmptyArrays: true,

    }
  },
  {
    $lookup: {
      from: "customers",
      localField: "schedules.participants",
      foreignField: "_id",
      as: "participants",

    }
  },
  {
    $project: {
      "participants.address": 0,
      "participants.birthday": 0,

    }
  },
  {
    $unwind: {
      path: "$participants",
      preserveNullAndEmptyArrays: true,

    }
  },
  {
    $group:
    {
      _id: "$_id",
      name: {
        $first: "$name",

      },
      schedules: {
        $first: "$schedules",

      },

    }
  },

]

1.此管道中的第一步是展开schedules数组,以获取文档中的每个单独的计划。
1.第二步是解开参与者,因为我需要参与者id来执行第三步中的查找过程。
1.第三步是在客户集合中查找参与者,返回的将是一个客户对象。
1.在第四步中,我将使用project从给定的参与者中删除不必要的字段。
1.在第五步中,我再次使用unwind来获取单个参与者(我知道也可以使用$first操作符)
1.在第六步中,我将分组
我尝试将步骤3中的每个参与者添加到参与者数组中的相应计划对象中,文档应该如下所示

{
    "name": "EXAMPLE",
    "schedules": [
      {
        "schedule_id": "id1",
        "participants": [
          {
            id: "id1",
            "name": "name1"
          },
          {
            id: "id2",
            "name": "name2"
          },

        ],

      },
      {
        "schedule_id": "id2",
        "participants": [
          {
            id: "id1",
            "name": "name1"
          },
          {
            id: "id2",
            "name": "name2"
          },

        ],

      },
      {
        "schedule_id": "id3",
        "participants": [
          {
            id: "id1",
            "name": "name1"
          },

        ],

      },

    ], 
  }
fwzugrvs

fwzugrvs1#

你的想法是对的,你可以简化你的流水线,从而使它更容易重建,第二个$unwind是冗余的,删除它将允许我们只使用1个组级来重建对象。这显然要简单得多。

db.collection.aggregate([
  {
    $unwind: {
      path: "$schedules",
      includeArrayIndex: "index",
      preserveNullAndEmptyArrays: true,

    }
  },
  {
    $lookup: {
      from: "customers",
      localField: "schedules.participants",
      foreignField: "_id",
      as: "participants",

    }
  },
  {
    $project: {
      "participants.address": 0,
      "participants.birthday": 0,

    }
  },
  {
    $group: {
      _id: "$_id",
      schedules: {
        $push: {
          schedule_id: "$schedules.schedule_id",
          participants: "$participants"
        }
      },
      name: {
        $first: "$name"
      }
    }
  }
])

Mongo Playground

相关问题