我想从三个集合中查找。开始点是一个集合,它有一个数组,其中有我想要查找另一个集合的键。有了那个查找的结果,我想再做一次查找。我将尝试分享一个蒙古游乐场的例子,以寻求安慰。
这是到实例的链接: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")
}
]发布于 2019-08-02 14:48:32
我们需要首先展开“STPO”,以查找它的值到另一个集合中。以下查询可以获得预期的输出:
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()输出:
{
"_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"
}
}
}
]
}
]
}https://stackoverflow.com/questions/57327576
复制相似问题