经过一些聚合阶段后,我想过滤文档中与条件匹配的数组

问题描述 投票:0回答:1

我有2个收藏

1. external_S_P_FLAT_main_api

2. external_S_C_FLAT_main_api

馆藏数据如下。

"external_S_P_FLAT_main_api": [
  {
    "_id": {
      "$oid": "654c6a594d0867aef588674d"
    },
    "data.pricing.material": "TG11",
    "data.pricing.controlling_area": "AJ00",
    "data.pricing.cost_center": "DE000001",
  },
  {
    "_id": {
      "$oid": "654c6a594d0867aef588674e"
    },
    "data.pricing.material": "TG12",
    "data.pricing.controlling_area": "AJ00",
    "data.pricing.cost_center": "DE000002",
  },
  {
    "_id": {
      "$oid": "654c6a594d0867aef588674f"
    },
    "data.pricing.material": "TG14",
    "data.pricing.controlling_area": "AJ00",
    "data.pricing.cost_center": "DE000003",
  },
  {
    "_id": {
      "$oid": "654c6a594d0867aef5886750"
    },
    "data.pricing.material": "TG2341",
    "data.pricing.controlling_area": "AJ00",
    "data.pricing.cost_center": "DE000004",
  }
]
"external_S_C_FLAT_main_api": [
  {
    "_id": {
      "$oid": "654c6a594d0867aef5886751"
    },
    "data.costcenter.controlling_area": "AJ00",
    "data.costcenter.cost_center": "DE000001",
    "data.costcenter.valid_from_date": "2023-09-12",
    "data.costcenter.long_description": "CC DE000001 - 3rd",
  },
  {
    "_id": {
      "$oid": "654c6a594d0867aef5886752"
    },
    "data.costcenter.controlling_area": "AJ00",
    "data.costcenter.cost_center": "DE000002",
    "data.costcenter.valid_from_date": "2022-03-02",
    "data.costcenter.long_description": "CC DE000002 - 1st",
  },
  {
    "_id": {
      "$oid": "654c6a594d0867aef5886753"
    },
    "data.costcenter.controlling_area": "AJ00",
    "data.costcenter.cost_center": "DE000003",
    "data.costcenter.valid_from_date": "2023-10-25",
    "data.costcenter.long_description": "CC DE000003 - 1st",
  },
  {
    "_id": {
      "$oid": "654c6a594d0867aef5886754"
    },
    "data.costcenter.controlling_area": "AJ00",
    "data.costcenter.cost_center": "DE000004",
    "data.costcenter.valid_from_date": "2023-10-25",
    "data.costcenter.long_description": "CC DE000004 - 2nd",
  }
]

下面是我正在执行的查询:

db.external_S_P_FLAT_main_api.aggregate([
  {
    "$addFields": {
      "external_S_P_FLAT_main_api_data.pricing.controlling_area": "$data.pricing.controlling_area"
    }
  },
  {
    "$addFields": {
      "external_S_P_FLAT_main_api_data.pricing.cost_center": "$data.pricing.cost_center"
    }
  },
  {
    "$lookup": {
      from: "external_S_C_FLAT_main_api",
      let: {
        let_data__pricing__controlling_area: "$external_S_P_FLAT_main_api_data.pricing.controlling_area",
        let_data__pricing__cost_center: "$external_S_P_FLAT_main_api_data.pricing.cost_center"
      },
      pipeline: [
        {
          "$match": {
            "$expr": {
              "$and": [
                {
                  "$eq": [
                    "$data.costcenter.controlling_area",
                    "$$let_data__pricing__controlling_area"
                  ]
                },
                {
                  "$eq": [
                    "$data.costcenter.cost_center",
                    "$$let_data__pricing__cost_center"
                  ]
                }
              ]
            }
          }
        }
      ],
      as: "from_external_S_C_FLAT_main_api"
    }
  },
  {
    "$project": {
      _id: 0,
      "external_S_P_FLAT_main_api_data.pricing.controlling_area": 0,
      "external_S_P_FLAT_main_api_data.pricing.cost_center": 0,
      // from_external_S_C_FLAT_main_api: 0,
    }
  }
])

下面是输出:

`

[
  {
    "data.pricing.controlling_area": "AJ00",
    "data.pricing.cost_center": "DE000001",
    "data.pricing.material": "TG11",
    "external_S_P_FLAT_main_api_data": {
      "pricing": {}
    },
    "from_external_S_C_FLAT_main_api": [
      {
        "_id": ObjectId("654c6a594d0867aef5886751"),
        "data.costcenter.controlling_area": "AJ00",
        "data.costcenter.cost_center": "DE000001",
        "data.costcenter.long_description": "CC DE000001 - 3rd",
        "data.costcenter.valid_from_date": "2023-09-12"
      },
      {
        "_id": ObjectId("654c6a594d0867aef5886752"),
        "data.costcenter.controlling_area": "AJ00",
        "data.costcenter.cost_center": "DE000002",
        "data.costcenter.long_description": "CC DE000002 - 1st",
        "data.costcenter.valid_from_date": "2022-03-02"
      },
      {
        "_id": ObjectId("654c6a594d0867aef5886753"),
        "data.costcenter.controlling_area": "AJ00",
        "data.costcenter.cost_center": "DE000003",
        "data.costcenter.long_description": "CC DE000003 - 1st",
        "data.costcenter.valid_from_date": "2023-10-25"
      },
      {
        "_id": ObjectId("654c6a594d0867aef5886754"),
        "data.costcenter.controlling_area": "AJ00",
        "data.costcenter.cost_center": "DE000004",
        "data.costcenter.long_description": "CC DE000004 - 2nd",
        "data.costcenter.valid_from_date": "2023-10-25"
      }
    ]
  },
  {
    "data.pricing.controlling_area": "AJ00",
    "data.pricing.cost_center": "DE000002",
    "data.pricing.material": "TG12",
    "external_S_P_FLAT_main_api_data": {
      "pricing": {}
    },
    "from_external_S_C_FLAT_main_api": [
      {
        "_id": ObjectId("654c6a594d0867aef5886751"),
        "data.costcenter.controlling_area": "AJ00",
        "data.costcenter.cost_center": "DE000001",
        "data.costcenter.long_description": "CC DE000001 - 3rd",
        "data.costcenter.valid_from_date": "2023-09-12"
      },
      {
        "_id": ObjectId("654c6a594d0867aef5886752"),
        "data.costcenter.controlling_area": "AJ00",
        "data.costcenter.cost_center": "DE000002",
        "data.costcenter.long_description": "CC DE000002 - 1st",
        "data.costcenter.valid_from_date": "2022-03-02"
      },
      {
        "_id": ObjectId("654c6a594d0867aef5886753"),
        "data.costcenter.controlling_area": "AJ00",
        "data.costcenter.cost_center": "DE000003",
        "data.costcenter.long_description": "CC DE000003 - 1st",
        "data.costcenter.valid_from_date": "2023-10-25"
      },
      {
        "_id": ObjectId("654c6a594d0867aef5886754"),
        "data.costcenter.controlling_area": "AJ00",
        "data.costcenter.cost_center": "DE000004",
        "data.costcenter.long_description": "CC DE000004 - 2nd",
        "data.costcenter.valid_from_date": "2023-10-25"
      }
    ]
  },
  {
    "data.pricing.controlling_area": "AJ00",
    "data.pricing.cost_center": "DE000003",
    "data.pricing.material": "TG14",
    "external_S_P_FLAT_main_api_data": {
      "pricing": {}
    },
    "from_external_S_C_FLAT_main_api": [
      {
        "_id": ObjectId("654c6a594d0867aef5886751"),
        "data.costcenter.controlling_area": "AJ00",
        "data.costcenter.cost_center": "DE000001",
        "data.costcenter.long_description": "CC DE000001 - 3rd",
        "data.costcenter.valid_from_date": "2023-09-12"
      },
      {
        "_id": ObjectId("654c6a594d0867aef5886752"),
        "data.costcenter.controlling_area": "AJ00",
        "data.costcenter.cost_center": "DE000002",
        "data.costcenter.long_description": "CC DE000002 - 1st",
        "data.costcenter.valid_from_date": "2022-03-02"
      },
      {
        "_id": ObjectId("654c6a594d0867aef5886753"),
        "data.costcenter.controlling_area": "AJ00",
        "data.costcenter.cost_center": "DE000003",
        "data.costcenter.long_description": "CC DE000003 - 1st",
        "data.costcenter.valid_from_date": "2023-10-25"
      },
      {
        "_id": ObjectId("654c6a594d0867aef5886754"),
        "data.costcenter.controlling_area": "AJ00",
        "data.costcenter.cost_center": "DE000004",
        "data.costcenter.long_description": "CC DE000004 - 2nd",
        "data.costcenter.valid_from_date": "2023-10-25"
      }
    ]
  },
  {
    "data.pricing.controlling_area": "AJ00",
    "data.pricing.cost_center": "DE000004",
    "data.pricing.material": "TG2341",
    "external_S_P_FLAT_main_api_data": {
      "pricing": {}
    },
    "from_external_S_C_FLAT_main_api": [
      {
        "_id": ObjectId("654c6a594d0867aef5886751"),
        "data.costcenter.controlling_area": "AJ00",
        "data.costcenter.cost_center": "DE000001",
        "data.costcenter.long_description": "CC DE000001 - 3rd",
        "data.costcenter.valid_from_date": "2023-09-12"
      },
      {
        "_id": ObjectId("654c6a594d0867aef5886752"),
        "data.costcenter.controlling_area": "AJ00",
        "data.costcenter.cost_center": "DE000002",
        "data.costcenter.long_description": "CC DE000002 - 1st",
        "data.costcenter.valid_from_date": "2022-03-02"
      },
      {
        "_id": ObjectId("654c6a594d0867aef5886753"),
        "data.costcenter.controlling_area": "AJ00",
        "data.costcenter.cost_center": "DE000003",
        "data.costcenter.long_description": "CC DE000003 - 1st",
        "data.costcenter.valid_from_date": "2023-10-25"
      },
      {
        "_id": ObjectId("654c6a594d0867aef5886754"),
        "data.costcenter.controlling_area": "AJ00",
        "data.costcenter.cost_center": "DE000004",
        "data.costcenter.long_description": "CC DE000004 - 2nd",
        "data.costcenter.valid_from_date": "2023-10-25"
      }
    ]
  }
]

我希望输出的方式是在数组 from_external_S_C_FLAT_main_api 中具有单个元素,该元素与条件匹配

data.pricing.cost_center 的值与 from_external_S_C_FLAT_main_api.data.costcenter.cost_center 匹配并且

data.pricing.controlling_area 的值与 from_external_S_C_FLAT_main_api.data.costcenter.controlling_area 匹配

所以预期的输出应该如下:

`

[
  {
    "data.pricing.controlling_area": "AJ00",
    "data.pricing.cost_center": "DE000001",
    "data.pricing.material": "TG11",
    "external_S_P_FLAT_main_api_data": {
      "pricing": {}
    },
    "from_external_S_C_FLAT_main_api": [
      {
        "_id": ObjectId("654c6a594d0867aef5886751"),
        "data.costcenter.controlling_area": "AJ00",
        "data.costcenter.cost_center": "DE000001",
        "data.costcenter.long_description": "CC DE000001 - 3rd",
        "data.costcenter.valid_from_date": "2023-09-12"
      }
    ]
  },
  {
    "data.pricing.controlling_area": "AJ00",
    "data.pricing.cost_center": "DE000002",
    "data.pricing.material": "TG12",
    "external_S_P_FLAT_main_api_data": {
      "pricing": {}
    },
    "from_external_S_C_FLAT_main_api": [
      {
        "_id": ObjectId("654c6a594d0867aef5886752"),
        "data.costcenter.controlling_area": "AJ00",
        "data.costcenter.cost_center": "DE000002",
        "data.costcenter.long_description": "CC DE000002 - 1st",
        "data.costcenter.valid_from_date": "2022-03-02"
      },
    ]
  },
  {
    "data.pricing.controlling_area": "AJ00",
    "data.pricing.cost_center": "DE000003",
    "data.pricing.material": "TG14",
    "external_S_P_FLAT_main_api_data": {
      "pricing": {}
    },
    "from_external_S_C_FLAT_main_api": [
      {
        "_id": ObjectId("654c6a594d0867aef5886753"),
        "data.costcenter.controlling_area": "AJ00",
        "data.costcenter.cost_center": "DE000003",
        "data.costcenter.long_description": "CC DE000003 - 1st",
        "data.costcenter.valid_from_date": "2023-10-25"
      },
    ]
  },
  {
    "data.pricing.controlling_area": "AJ00",
    "data.pricing.cost_center": "DE000004",
    "data.pricing.material": "TG2341",
    "external_S_P_FLAT_main_api_data": {
      "pricing": {}
    },
    "from_external_S_C_FLAT_main_api": [
      {
        "_id": ObjectId("654c6a594d0867aef5886754"),
        "data.costcenter.controlling_area": "AJ00",
        "data.costcenter.cost_center": "DE000004",
        "data.costcenter.long_description": "CC DE000004 - 2nd",
        "data.costcenter.valid_from_date": "2023-10-25"
      }
    ]
  }
]

我错过了什么?我怎样才能得到预期的结果?

mongodb mongodb-query aggregation
1个回答
0
投票

由于您的字段包含点,因此使用

$
获取字段值是不合适的,因为它认为您正在访问(嵌套)对象中的字段。例如:
data.pricing.controlling_area
,只有当其结构如下时,才能通过
$
获取字段值:

"data": {
  "pricing": {
    "controlling_area": "AJ00"
  }
}

要获取字段包含点的字段,您需要

$getField

如果您想添加/设置带点的字段,同样如此,您需要

$setField

我建议删除前两个阶段,因为没有必要添加一个字段,您可以从原始字段中获取值,并且您还需要在投影阶段删除这些字段。

db.external_S_P_FLAT_main_api.aggregate([
  {
    "$lookup": {
      from: "external_S_C_FLAT_main_api",
      let: {
        let_data__pricing__controlling_area: {
          $getField: "data.pricing.controlling_area"
        },
        let_data__pricing__cost_center: {
          $getField: "data.pricing.cost_center"
        }
      },
      pipeline: [
        {
          "$match": {
            "$expr": {
              "$and": [
                {
                  "$eq": [
                    {
                      $getField: "data.costcenter.controlling_area"
                    },
                    "$$let_data__pricing__controlling_area"
                  ]
                },
                {
                  "$eq": [
                    {
                      $getField: "data.costcenter.cost_center"
                    },
                    "$$let_data__pricing__cost_center"
                  ]
                }
              ]
            }
          }
        }
      ],
      as: "from_external_S_C_FLAT_main_api"
    }
  },
  {
    "$project": {
      _id: 0
    }
  }
])

演示@Mongo Playground

© www.soinside.com 2019 - 2024. All rights reserved.