【问题标题】:MongoDB lookup array of objects by field and retain other fields in resultMongoDB 按字段查找对象数组并在结果中保留其他字段
【发布时间】:2020-06-11 14:56:58
【问题描述】:

我试图弄清楚如何通过特定字段查找对象数组,同时保留与查找字段处于同一级别的其他字段。

我的processes收藏如下:

{
    _id: 'p1',
    steps: [
        {
            _id: 'ps1',
            step: 's1',
            time: 10
        },
        {
            _id: 'ps2',
            step: 's2',
            time: 15
        }
    ]
}

steps 集合看起来像(对于带有_id: s1 的文档):

{
    _id: 's1',
    name: 'step 1'
}

我的聚合:

processes.aggregate([
    {
        // match stage or whatever prior stage
    },
    {
        $lookup: {
             from: 'steps',
             localField: 'steps.step',
             foreignField: '_id',
             as: 'steps'
        }
    }
])

这可行,但基本上会删除与查找字段 (steps.step) 处于同一级别的 steps._idsteps.time 字段,如输出所示:

{
    _id: 'p1',
    steps: [
        {
            _id: 's1',
            name: 'step 1'
        },
        {
            _id: 's2',
            name: 'step 2'
        }
    ]
}

虽然预期的输出是:

{
    _id: 'p1',
    steps: [
        {
            _id: 'ps1',
            time: 10,
            stepId: 's1',
            name: 'step 1',
        },
        {
            _id: 'ps2',
            time: 15,
            stepId: 's2',
            name: 'step 2',
        }
    ]
}

注意:预期输出中的_id字段不是很重要,可以包含step文档的_id,避免有单独的stepId 字段。

编辑

其他问题移至此处:MongoDB lookup array of objects by field (join conditions and uncorrelated sub-queries)

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    经过大量研究,我可以找到实现我在问题中的意思的方法。

    主要思想是将两个对象数组合并在一起。

    processes.aggregate([
        {
            // match stage or whatever prior stage
        },
        {
            $lookup: {
                 from: 'steps',
                 localField: 'steps.step',
                 foreignField: '_id',
                 as: 'steps2'
            },
            {
                $addFields: {
                  stages: {
                    $map: {
                      input: '$steps',
                        in: {
                          $mergeObjects: [
                            '$$this',
                            {
                              $arrayElemAt: [
                                '$steps2',
                                {
                                  $indexOfArray: ['$steps2._id', '$$this.step'],
                                },
                              ],
                            },
                          ],
                        },
                      },
                    },
                  },
            }
        }
    ])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-29
      • 1970-01-01
      • 2017-06-14
      • 2021-01-09
      • 2019-11-08
      • 2021-02-11
      • 2019-05-11
      • 2020-05-06
      相关资源
      最近更新 更多