【问题标题】:Using $lookup on an array of objects to join two documents in MongoDB [duplicate]在对象数组上使用 $lookup 来连接 MongoDB 中的两个文档 [重复]
【发布时间】:2018-08-12 01:02:02
【问题描述】:

我有许多 Shop 文档,每个文档都包含一个字段 products,这是一个对象数组,其中键是产品 ID,值是库存数量:

{ products: [{"a": 3}, {"b": 27}, {"c": 4}] }

我有一个集合Products,其中每个产品都有一个包含productIdname 等的文档:

{ productId: "a", "name": "Spanner"}

我想提取/汇总/加入每个项目的产品信息。我知道当字段是单个 ID 时该怎么做,并且我看到 this answer 描述了如何为一组 ID 做这件事。但是我在思考如何处理包含 ID 的对象数组时遇到了一些麻烦。

期望的输出:

{
    products: [
        { {productId: "a", "name": "Spanner"}: 3 }
    ]
}

(不,切换到关系数据库不在我的控制范围内。)

【问题讨论】:

  • 如果反对者可以解释我如何改进这个问题,那将不胜感激!

标签: javascript mongodb mongodb-query


【解决方案1】:

我认为如果您想使用 ID 进行参考,请尽量避免将其作为对象键,而是将其作为对象属性,如 { products: [{"productId": $_id, "quantity": 3}]} ,这可能是投反对票的原因。

但是如果你不能改变它,你可以在聚合中使用$objectToArray来转换你的数组。

还有一点,你想要的输出是不真实的,因为 js 中的对象属性不能不是对象。

试试看:

db.Shop.aggregate(

// Pipeline
[
    // Stage 1
    {
        $unwind: {
            path : "$products"
        }
    },

    // Stage 2
    {
        $project: {
            products: { $objectToArray: "$products" }
        }
    },

    // Stage 3
    {
        $unwind: {
            path : "$products"
        }
    },

    // Stage 4
    {
        $project: {
            productId: "$products.k",
            productQuantity: "$products.v"
        }
    },

    // Stage 5
    {
        $lookup: {
            "from" : "products",
            "localField" : "productId",
            "foreignField" : "productId",
            "as" : "products"
        }
    },

    // Stage 6
    {
        $unwind: {
            path : "$products"
        }
    },

    // Stage 7
    {
        $project: {
            productId: "$productId",
            productQuantity: "$productQuantity",
            productName: "$products.name"
        }
    },
]);

祝你好运

【讨论】:

  • 谢谢。但是,即使我更改为您建议的格式,我的问题是我不确定如何访问每个对象内部的属性(因此,productId)。对不起,如果我不清楚。
  • 您可以通过 $products.productId 访问对象属性
猜你喜欢
  • 2023-01-17
  • 2017-02-07
  • 2016-08-03
  • 2020-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-10
相关资源
最近更新 更多