从 $lookup in mongo 返回的列表中提取一个值

Extract a value from the list returned by $lookup in mongo

我在 mongo 数据库中有 2 个集合。

# Collaction 1 named C1
{
   _id: 1,
  a: 10
},
{
  _id: 2,
  a: 20
}
# Collaction 2 named C2
{
   _id: 1,
  b: 500
},
{
  _id: 2,
  b: 600
}

我尝试使用下面的 $lookup 查询

加入两者
db.C1.aggregate(
[
  {
    $lookup: {
      from: "C2",
      localField: "_id",
      foreignField: "_id",
      as: "b"
    }
  }
]);

它returns输出集合看起来像这样,

{
  _id: 1,
  a: 10,
  b: [{_id: 1, b: 500}]
},
{
  _id: 2,
  a: 20,
  b: [{_id: 2, b: 600}]
}

join 工作成功,但我只想要集合 2 中 b 的值而不是整个文档作为列表,

#Desired Output
{
  _id: 1,
  a: 10,
  b: 500
},
{
  _id: 2,
  a: 20,
  b: 600
}

我们如何做到这一点?

使用Concise syntax.

let 字段中使用 _id 设置一个变量,并使用 pipeline 字段在您的 lookup 集合 (c2) 上实现所需的阶段。

希望这段代码对您有所帮助:

db.C1.aggregate(
[
    {
        "$lookup": {
            "from": "C2",
            "as": "b",
            "let": {
                "localId": "$_id"
            },
            "pipeline": [
                {
                    "$match": {
                        "$expr": {
                            "$eq": [
                                "$_id",
                                "$$localId"
                            ]
                        }
                    }
                },
                {
                    "$project": {
                        "_id": false,
                        "b": true
                    }
                },
                {
                    "$limit": 1
                }
            ]
        }
    },
    {
        "$addFields": {
            "b": {
                "$arrayElemAt": [
                    "$b",
                    0
                ]
            }
        }
    }
]
);

lookup 管道的第 3 阶段仅用于获取第一个文档 ($limit: 1)。

aggregate 上的第 2 阶段仅用于替换 b 属性.

上的 $b