MongoDB聚合查找从localField到结果的其他字段

时间:2020-05-28 16:58:21

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

我在MongoDB(mongoplayground)[charactersguilds]中有以下集合

我要创建一个$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阶段):< / p>

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

那么,是否可以选择在$lookup之后添加一个附加字段?

(Mongo -v 4.2.3,因此该问题与新语法支持无关)

1 个答案:

答案 0 :(得分:1)

您几乎快要解决它了。由于members是一个数组,因此您需要将其传递给$lookup,然后按条件将每个字符与$reduce连接起来(也可以对$filter进行此操作,但是接下来我们需要调整阶段。

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

尝试这个:

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

相关问题