我有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"
}
]
}
]
我错过了什么?我怎样才能得到预期的结果?
由于您的字段包含点,因此使用
$
获取字段值是不合适的,因为它认为您正在访问(嵌套)对象中的字段。例如: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
}
}
])