【发布时间】:2019-12-11 03:30:45
【问题描述】:
我想从三个集合中查找。起点是一个集合,它有一个数组,其中有我想用来查找另一个集合的键。有了该查找的结果,我想做另一个查找。为了方便起见,我将尝试共享一个 Mongo 操场实例。
这是实例的链接: https://mongoplayground.net/p/4rJflL1UF81
使用它,您可以查看 mongodb 版本以及源集合、查询和实际结果。
我已经尝试了几种方法:
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 数组中的键在对象内部,所以它不起作用。如果我切换
"let": {
"aufnr": "$STPO.AUFNR"
}
与
"let": {
"aufnr": "$STKO.RUNNR"
}
正在生成所需的格式,但仍然不正确,因为需要从 STPO 数组中收集 AUFNR。
第一个获取我想要的所有数据,但不是我想要的格式,这将很快出现。我可能只需要在我的查询中进一步转换这个结果,但目前,我不知道如何。我也无法展示我在这方面已经尝试过的东西,因为我还没有接近接近我想要的格式。
这是预期的结果:
[
{
"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")
}
]
【问题讨论】:
标签: mongodb mongodb-query