【问题标题】:Lookup for a referenced document in an array of embedded documents在嵌入文档数组中查找引用的文档
【发布时间】:2020-04-16 13:38:08
【问题描述】:

我有两个收藏。 一个包含一组对象。这些对象拥有一个字段,该字段具有另一个集合中文档的 id。 目标是用文档“替换” ref。听起来很简单,但我不知道如何存档。

例如

集合“产品”

{ "_id": 1,
  "alias": "ProductA"
},
{ "_id": 2,
  "alias": "ProductC"
}

集合“订单”

{ "_id": 5765,
  "cart": [
    {
      "product": 1,
      "qty": 7
    }, {
      "product": 2,
      "qty": 6
    }
  ]
}

我需要的查询是这样的:

{ "_id": 5765,
  "cart": [
    {
      "product": {
        "_id": 1,
        "alias": "ProductA"
      },
      "qty": 7
    }, {
      "product": {
        "_id": 2,
        "alias": "ProductC"
      },
      "qty": 6
    }
  ]
}

我尝试了一个简单的查找,但该数组将只包含产品。我需要改变什么?

{
    $lookup: {
        from: "products",
        let: {
            tmp: "$cart.product"
        },
        pipeline: [
            {
                $match: {
                    $expr: {
                        $in: ["$_id", "$$tmp"]
                    }
                }
            }
        ],
        as: "cart.product"
    }
}

感谢您的帮助。

【问题讨论】:

    标签: mongodb aggregation-framework lookup


    【解决方案1】:

    我添加了一个新的$addFields 阶段来转换来自$lookup 阶段的输出 - 它得到了所需的输出:

    db.order.aggregate([
    {
        $lookup: {
            from: "product",
            let: {
                tmp: "$cart.product"
            },
            pipeline: [
                {
                    $match: {
                        $expr: {
                            $in: ["$_id", "$$tmp"]
                        }
                    }
                }
            ],
            as: "products"
        }
    },
    { 
        $addFields: {
             cart: {
                 $map: {
                     input: "$cart", as: "ct",
                     in: {
                         product: {
                             $arrayElemAt: [ 
                                 { $filter: {
                                       input: "$products", as: "pr",
                                       cond: {
                                          $eq: [ "$$ct.product", "$$pr._id" ]
                                       }
                                  }
                              }, 0 ]
                         },
                         qty: "$$ct.qty"
                     }
                 }
             }
        }
    }
    ] ).pretty()
    

    【讨论】:

    • 哼...有一个小“错误”。 “购物车”中的“产品”是一个包含一个元素的数组。我该如何放松?!
    • 是的,你是对的;我没注意到。我修复了它并更新了代码。无需展开,因为数组中只有一个元素 - 只需获取第一个元素即可。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 1970-01-01
    • 2018-07-24
    相关资源
    最近更新 更多