【问题标题】:Extract a value from the list returned by $lookup in mongo从 mongo 中 $lookup 返回的列表中提取一个值
【发布时间】:2021-11-07 05:54:09
【问题描述】:

我在 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"
    }
  }
]);

它返回一个如下所示的输出集合,

{
  _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
}

我们怎样才能做到这一点?

【问题讨论】:

    标签: mongodb mongodb-query pymongo


    【解决方案1】:

    使用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 值。

    【讨论】:

    • 正是我想要的! ?
    猜你喜欢
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 2013-06-10
    • 2021-12-13
    • 2021-02-05
    • 2021-04-23
    相关资源
    最近更新 更多