【问题标题】:mongoose aggregate lookup in project项目中的猫鼬聚合查找
【发布时间】:2021-10-24 19:33:10
【问题描述】:

我目前有 3 个不同的系列。

ColA

{
    id: 1,
    some_other_data: "fff"
}

ColB

{
    id: 1,
    colA_id: 1,
    spec_id: 5,
    data: "test"
}

ColC

{
    id: 5,
    colA_id: 1,
    name: "xxx"
}

我当前的代码:

const list = await ColA.aggregate([
{
    $lookup: {
    from: "ColB",
    localField: "_id",
    foreignField: "ColA_id",
    as: "col_b_list",
    },
},
{
    $lookup: {
    from: "ColC",
    localField: "col_b_list.spec_id",
    foreignField: "_id",
    as: "col_c_list",
    },
},
{
    $project: {
    _id: 1,
    list: "$col_b_list",
    },
},
]);

return list;

我有以下输出。

[
    {
        "_id": "6123858b5b8dcc0e749c9e39",
        "list": [
            {
                "_id": "6123858b5b8dcc0e749c9e43",
                "spec_id": "60d33125f81840c010052e03",
                "createdAt": "2021-08-23T11:24:59.292Z",
                "updatedAt": "2021-08-23T11:24:59.292Z",
                "__v": 0
            },
            {
                "_id": "612386317dd1cb0ebcef1862",
                "spec_id": "60d33125f81840c010052e03",
                "createdAt": "2021-08-23T11:27:45.515Z",
                "updatedAt": "2021-08-23T11:27:45.515Z",
                "__v": 0
            }
        ]
    }
]

我想要实现的是在 ColB 中获取 spec_id,并将 ColC 中的 id 放在一个对象中。

但我想要的是,在列表对象中包含查找的 Collection ColC,例如:

[
    {
        "_id": "6123858b5b8dcc0e749c9e39",
        "some_other_data": "fff",
        "list": [
            {
                "_id": "6123858b5b8dcc0e749c9e43",
                "spec_id": "60d33125f81840c010052e03",
                "name": "xxx",
                "createdAt": "2021-08-23T11:24:59.292Z",
                "updatedAt": "2021-08-23T11:24:59.292Z",
                "__v": 0
            },
            {
                "_id": "612386317dd1cb0ebcef1862",
                "spec_id": "60d33125f81840c010052e03",
                "name": "yyy",
                "createdAt": "2021-08-23T11:27:45.515Z",
                "updatedAt": "2021-08-23T11:27:45.515Z",
                "__v": 0
            }
        ]
    }
]

我尝试在项目阶段对其进行映射,但不知何故存在多个相同的对象,因此我无法使其正常工作。

提前感谢您的帮助!

【问题讨论】:

    标签: node.js mongodb mongoose aggregation-framework


    【解决方案1】:

    您可以使用嵌套的$lookup,使用带有聚合管道的查找,

    const list = await ColA.aggregate([
      {
        $lookup: {
          from: "ColB",
          let: { id: "$_id" },
          pipeline: [
            {
              $match: {
                $expr: { $eq: ["$$id", "$ColA_id"] }
              }
            },
            {
              $lookup: {
                from: "ColC",
                localField: "spec_id",
                foreignField: "id",
                as: "ColC"
              }
            },
            {
              $addFields: {
                ColC: { $arrayElemAt: ["$ColC", 0] }
              }
            },
            // { $project: {} }
          ],
          as: "list"
        }
      }
    ])
    

    【讨论】:

      猜你喜欢
      • 2019-08-12
      • 1970-01-01
      • 2021-05-06
      • 2020-12-01
      • 2015-05-19
      • 2022-01-26
      • 2022-12-05
      • 2019-08-29
      • 1970-01-01
      相关资源
      最近更新 更多