【问题标题】:MongoDB aggregate result with two different keysMongoDB 使用两个不同的键聚合结果
【发布时间】:2015-07-26 07:54:21
【问题描述】:

我最近提出了这个问题,它帮助我获取了一个数组,用于在聚合 mongoDB 查询中获取结果 (MongoDB Aggregate Array with Two Fields)

我现在的问题是获得组合两个不同的键。

我有一个包含一般产品的产品集合:

{
  "_id" : ObjectId("554b9f223d77c810e8915539"),
  "brand" : "Airtex",
  "product" : "E7113M",
  "type" : "Fuel Pump",
  "warehouse_sku" : [
    "1_5551536f3d77c870fc388a04",
    "2_55515e163d77c870fc38b00a"
   ]
}

我有以下子产品(上面有多个通用产品)

{
    "_id" : ObjectId("55524d0c3d77c8ba9cb2d9fd"),
    "brand" : "Performance",
    "product" : "P41K",
    "type" : "Fuel Pump Component",
    "general_products" : [
        ObjectId("554b9f123d77c810e891552f"),
        ObjectId("554b9f143d77c810e8915530"),
        ObjectId("554b9f173d77c810e8915533"),
        ObjectId("554b99b83d77c810e8915436"),
        ObjectId("554b9f2e3d77c810e8915549")
    ],
    "warehouse_sku" : [
        "1_555411043d77c8066b3b6720",
        "1_555411073d77c8066b3b6728"
    ]
}

我的问题是我想要带有 _id 的一般产品和与特定的warehouse_sku 模式匹配的内部子产品。想要的结果是这样的:

{ "_id" : ObjectId("554b9f2e3d77c810e8915549") }
{ "_id" : ObjectId("554b99b83d77c810e8915436") }
{ "_id" : ObjectId("554b9f173d77c810e8915533") }
{ "_id" : ObjectId("554b9f143d77c810e8915530") }
{ "_id" : ObjectId("554b9f123d77c810e891552f") }
{ "_id" : ObjectId("554b9f223d77c810e8915539") }

我进行了多个查询,例如:

1)

db.products.aggregate([
... {$match:{warehouse_sku: /^1/ }},
... {$unwind:"$general_products"},
... {$group:{_id: "$general_products"}}
... ])

但是一般产品的_id不在上面:

{ "_id" : ObjectId("554b9f2e3d77c810e8915549") }
{ "_id" : ObjectId("554b99b83d77c810e8915436") }
{ "_id" : ObjectId("554b9f173d77c810e8915533") }
{ "_id" : ObjectId("554b9f143d77c810e8915530") }
{ "_id" : ObjectId("554b9f123d77c810e891552f") }

2)

db.products.aggregate([
... {$match:{warehouse_sku: /^1/ }},
... {$group:{_id: "$_id"}}
... ])

但给我通用和子产品的 _id [不想要],而不是子产品内通用产品的 _id:

{ "_id" : ObjectId("55524d0c3d77c8ba9cb2d9fd") }
{ "_id" : ObjectId("554b9f223d77c810e8915539") }

【问题讨论】:

    标签: arrays mongodb mongodb-query


    【解决方案1】:

    使用以下聚合管道获取所需的 ObjectId 列表。如果数组general_products 字段不存在,这将使用$ifNull 聚合运算符添加_id 字段:

    db.products.aggregate([
        {
            "$match": {"warehouse_sku": /^1/ }
        },
        {
            "$group": {
                "_id": {
                    "_id": "$_id",
                    "general_products": "$general_products"
                },
                "data": {
                    "$addToSet": "$_id"
                }
            }
        },
        {
            "$project": {
                "_id": 0,
                "general_products": {
                    "$ifNull": ["$_id.general_products", "$data"]
                }
            }
        },
        {
            "$unwind": "$general_products"
        },
        {
            "$group": {
                "_id": null,
                "list_products": {
                    "$addToSet": "$general_products"
                }
            }
        }
    ]);
    

    这将为您提供一个包含数组 list_products 和 ObjectIds 的文档:

    /* 1 */
    {
        "result" : [ 
            {
                "_id" : null,
                "list_products" : [ 
                    ObjectId("554b9f223d77c810e8915539"), 
                    ObjectId("554b9f2e3d77c810e8915549"), 
                    ObjectId("554b99b83d77c810e8915436"), 
                    ObjectId("554b9f173d77c810e8915533"), 
                    ObjectId("554b9f143d77c810e8915530"), 
                    ObjectId("554b9f123d77c810e891552f")
                ]
            }
        ],
        "ok" : 1
    }
    

    【讨论】:

    • @technology_dreamer 别担心 :-)
    猜你喜欢
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-28
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    相关资源
    最近更新 更多