首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带有数组的MongoDB嵌套查找累积3集

带有数组的MongoDB嵌套查找累积3集
EN

Stack Overflow用户
提问于 2019-08-02 13:34:04
回答 1查看 163关注 0票数 1

我想从三个集合中查找。开始点是一个集合,它有一个数组,其中有我想要查找另一个集合的键。有了那个查找的结果,我想再做一次查找。我将尝试分享一个蒙古游乐场的例子,以寻求安慰。

这是到实例的链接:https://mongoplayground.net/p/4rJflL1UF81

使用它,您可以看到mongodb版本以及源集合、查询和实际结果。

我已经尝试过几种方法:

代码语言:javascript
运行
复制
db.SlittingPatterns.aggregate([
  {
    "$lookup": {
      "from": "Orders",
      "localField": "STPO.AUFNR",
      "foreignField": "OrderHead.AUFNR",
      "as": "ORDERS"
    }
  },
  {
    "$lookup": {
      "from": "Materials",
      "localField": "ORDERS.OrderHead.MATNR",
      "foreignField": "MATERIAL.AS_MARA.MATNR",
      "as": "MATERIALS"
    }
  }
])


db.SlittingPatterns.aggregate([
    {
        "$lookup": {
            "from": "Orders",
            "let": {
                "aufnr": "$STPO.AUFNR"
            },
            "pipeline": [
                {
                    "$match": {
                        "$expr": {
                            "$eq": [
                                "$OrderHead.AUFNR",
                                "$$aufnr"
                            ]
                        }
                    }
                },
                {
                    "$lookup": {
                        "from": "Materials",
                        "let": {
                            "matnr": "$OrderHead.MATNR"
                        },
                        "pipeline": [
                            {
                                "$match": {
                                    "$expr": {
                                        "$eq": [
                                            "$MATERIAL.AS_MARA.MATNR",
                                            "$$matnr"
                                        ]
                                    }
                                }
                            }
                        ],
                        "as": "MATERIALS"
                    }
                },
                {
                    "$unwind": "$MATERIALS"
                }
            ],
            "as": "ORDERS"
        }
    },
    {
        "$unwind": "$ORDERS"
    }
])

最后一个问题的灵感来自于这个问题:

$lookup nested array in mongodb

这看起来非常接近我想要的,但是似乎是因为STPO数组中的键在对象中,它不起作用。如果我换了

代码语言:javascript
运行
复制
"let": {
  "aufnr": "$STPO.AUFNR"
}

使用

代码语言:javascript
运行
复制
"let": {
  "aufnr": "$STKO.RUNNR"
}

正在生成所需的格式,但仍然不正确,因为需要从STPO数组中收集AUFNR。

第一个是获取我想要的所有数据,但不是我想要的格式,很快就会这样。我很可能只需要在查询中进一步转换这个结果,但目前我不知道如何转换。我也不能展示我在这方面已经尝试过的东西,因为我还没有接近我想要的格式。

以下是预期的结果:

代码语言:javascript
运行
复制
[
  {
    "ORDERS": [
      {
        "MATERIALS": [
          {
            "MATERIAL": {
              "AS_MARA": {
                "MATNR": "456"
              }
            },
            "_id": ObjectId("5a934e000102030405000000")
          }
        ],
        "OrderHead": {
          "AUFNR": "123",
          "MATNR": "456"
        },
        "_id": ObjectId("5a934e000102030405000003")
      },
      {
        "MATERIALS": [
          {
            "MATERIAL": {
              "AS_MARA": {
                "MATNR": "654"
              }
            },
            "_id": ObjectId("5a934e000102030405000001")
          }
        ],
        "OrderHead": {
          "AUFNR": "321",
          "MATNR": "654"
        },
        "_id": ObjectId("5a934e000102030405000004")
      }
    ],
    "STKO": {
      "RUNNR": "123"
    },
    "STPO": [
      {
        "AUFNR": "123"
      },
      {
        "AUFNR": "321"
      }
    ],
    "_id": ObjectId("5a934e000102030405000005")
  }
]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-02 14:48:32

我们需要首先展开“STPO”,以查找它的值到另一个集合中。以下查询可以获得预期的输出:

代码语言:javascript
运行
复制
db.SlittingPatterns.aggregate([
    {
        $unwind:"$STPO"
    },
    {
        $lookup:{
            "from":"Orders",
            "let":{
                "aufnr":"$STPO.AUFNR"
            },
            "pipeline":[
                {
                    $match:{
                        $expr:{
                            $eq:["$OrderHead.AUFNR","$$aufnr"]
                        }
                    }
                },
                {
                    $lookup:{
                        "from":"Materials",
                        "let":{
                            "matnr":"$OrderHead.MATNR"
                        },
                        "pipeline":[
                            {
                                $match:{
                                    $expr:{
                                        $eq:["$MATERIAL.AS_MARA.MATNR","$$matnr"]
                                    }
                                }
                            }
                        ],
                        "as":"MATERIALS"
                    }
                }
            ],
            "as":"ORDERS"
        }
    },
    {
        $unwind:{
            path: "$ORDERS",
            "preserveNullAndEmptyArrays":true
        }
    },
    {
        $group:{
            "_id":"$_id",
            "STKO":{
                $first:"$STKO"
            },
            "STPO":{
                $push:"$STPO"
            },
            "ORDERS":{
                $push:"$ORDERS"
            }
        }
    }
]).pretty()

输出:

代码语言:javascript
运行
复制
{
    "_id" : ObjectId("5d444745748b0f59369a8040"),
    "STKO" : {
        "RUNNR" : "123"
    },
    "STPO" : [
        {
            "AUFNR" : "123"
        },
        {
            "AUFNR" : "321"
        }
    ],
    "ORDERS" : [
        {
            "_id" : ObjectId("5d444732748b0f59369a803e"),
            "OrderHead" : {
                "AUFNR" : "123",
                "MATNR" : "456"
            },
            "MATERIALS" : [
                {
                    "_id" : ObjectId("5d444718748b0f59369a803b"),
                    "MATERIAL" : {
                        "AS_MARA" : {
                            "MATNR" : "456"
                        }
                    }
                }
            ]
        },
        {
            "_id" : ObjectId("5d444732748b0f59369a803f"),
            "OrderHead" : {
                "AUFNR" : "321",
                "MATNR" : "654"
            },
            "MATERIALS" : [
                {
                    "_id" : ObjectId("5d444718748b0f59369a803c"),
                    "MATERIAL" : {
                        "AS_MARA" : {
                            "MATNR" : "654"
                        }
                    }
                }
            ]
        }
    ]
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57327576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档