【问题标题】:MongoDB aggregation lookup additional field from localField to resultMongoDB 聚合查找从 localField 到结果的附加字段
【发布时间】:2020-09-16 02:26:23
【问题描述】:

我在 MongoDB 中有以下集合 (mongoplayground) [characters,guilds]

我想创建一个$lookup,它将rank 字段添加到生成的文档中,如下所示:

    "members_t": [
      {
        "_id": ObjectId("5a934e000102030405000000"),
        "level": 20,
        "name": "test1",
        "rank": 1
      },
      {
        "_id": ObjectId("5a934e000102030405000001"),
        "level": 40,
        "name": "test2",
        "rank": 2
      }
    ]

旧的$lookup 语法对此无能为力,但以下使用新语法的查询会在tested 字段中返回一个空数组(即使没有$addFields 阶段):

  {
    $lookup: {
      from: "characters",
      let: {
        members_name: "$members.name",
        rank: "$members.rank"
      },
      pipeline: [
        {
          $match: {
            name: "$$members_name"
          }
        }
      ],
      as: "tested"
    }
  }

那么,是否有任何选项可以在$lookup 阶段之后添加额外的字段?

(Mongo -v 4.2.3,所以问题与新语法支持无关)

【问题讨论】:

    标签: javascript mongodb mongoose mongodb-query aggregation-framework


    【解决方案1】:

    你几乎接近解决它。由于members 是一个数组,您需要将它传递给$lookup,然后有条件地使用$reduce 将每个字符加入它(您也可以使用$filter 来执行此操作,但是我们需要额外的阶段)。

    注意:Explanation 为什么我们需要在$lookup 管道中使用$expr

    试试这个:

    db.guilds.aggregate([
      {
        $lookup: {
          from: "characters",
          let: {
            members: "$members"
          },
          pipeline: [
            {
              $match: {
                $expr: {
                  $in: [
                    "$name",
                    "$$members.name"
                  ]
                }
              }
            },
            {
              $addFields: {
                rank: {
                  $reduce: {
                    input: "$$members",
                    initialValue: null,
                    in: {
                      $cond: [
                        {
                          $eq: [
                            "$$this.name",
                            "$name"
                          ]
                        },
                        "$$this.rank",
                        "$$value"
                      ]
                    }
                  }
                }
              }
            }
          ],
          as: "members_t"
        }
      }
    ])
    

    MongoPlayground

    【讨论】:

      猜你喜欢
      • 2020-07-15
      • 1970-01-01
      • 2019-01-17
      • 1970-01-01
      • 1970-01-01
      • 2021-10-26
      • 2019-01-14
      • 2021-09-08
      • 2016-02-03
      相关资源
      最近更新 更多