在对象数组上使用$ lookup联接MongoDB中的两个文档

时间:2018-08-12 01:02:03

标签: javascript mongodb mongodb-query

我有许多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 }
    ]
}

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

1 个答案:

答案 0 :(得分:2)

我想,如果您想使用ID作为参考,请尽量避免将其作为对象键放置,而应将其作为对象属性,例如{产品:[{“ 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"
        }
    },
]);

祝你好运