我想使用聚合根据详细信息下(orderList和orderHistory中)的orderNo和articleCode执行join
orderList: {
"orderNo": "0000004680",
"details": [{
"articleCode": "000000000910000130",
"pgiStatus": " ",
"fulfillmentStatus": "Y",
"shortCloseStatus": "Y"
},
{
"articleCode": "000000000910000131",
"pgiStatus": " ",
"shortCloseQty": "0",
"fulfillmentStatus": "Y",
}
]
}
orderHistory: {
"orderNo": "0000004680",
"orderHistoryStatus": "COM",
"details": [{
"shipmentStatus": "SHF",
"articleCode": "000000000910000130",
"billingDocNo": "0000123"
}]
}
下面是我写的查询:
let query = [{
$match: {
orderNo,
"createdBy": userId
}
},
{
$unwind: "$details"
},
{
$lookup: {
from: "jed_order_history",
let: {
orderNo: "$orderNo",
articleCode: "$details.articleCode"
},
pipeline: [{
$match: {
$expr: {
$and: [{
$eq: ["$orderNo", "$$orderNo"]
},
{
$eq: ["$details.articleCode", "$$articleCode"]
}
]
}
}
}],
as: "orderHistory"
}
},
{
$unwind: {
path: "$orderHistory",
preserveNullAndEmptyArrays: true
}
},
{
$lookup: {
from: "jed_orderShipment",
localField: "orderHistory.details.billingDocNo",
foreignField: "billingNumber",
as: "orderShipment"
}
},
{
$project: {
orderNo: 1,
createdAt: 1,
paymentAccountingStatus: 1,
orderListDetails: "$details",
orderHistory: {
$ifNull: ["$orderHistory", {}]
},
orderShipment: {
$ifNull: [{
$arrayElemAt: ["$orderShipment", 0]
}, {}]
}
}
}
];
在这里,在输出中,
orderHistory
和orderShipment
都显示为空对象,即使存在匹配数据。
当我删除这部分
{ $eq: ["$details.articleCode", "$$articleCode"] }
时,我将获得预期的数据,但我必须根据orderNo
和articleCode
字段下的details
进行搜索。
首先,我认为你打错了
from: "jed_order_history"
应该是from: "orderHistory"
,其次我认为你需要在unwind
details
中lookup
pipeline
进行比赛。因为这是必要的,因为详细信息位于数组中,您需要单独比较每个项目
let query = [
{
$match: {
orderNo,
"createdBy": userId
}
},
{
$unwind: "$details"
},
{
$lookup: {
from: "orderHistory",
let: { localOrderNo: "$orderNo", localArticleCode: "$details.articleCode" },
pipeline: [
{ $unwind: "$details" },
{
$match: {
$expr: {
$and: [
{ $eq: ["$orderNo", "$$localOrderNo"] },
{ $eq: ["$details.articleCode", "$$localArticleCode"] }
]
}
}
}
],
as: "orderHistory"
}
},
{
$unwind: {
path: "$orderHistory",
preserveNullAndEmptyArrays: true
}
},
{
$lookup: {
from: "orderShipment",
localField: "orderHistory.details.billingDocNo",
foreignField: "billingNumber",
as: "orderShipment"
}
},
{
$project: {
orderNo: 1,
createdAt: 1,
paymentAccountingStatus: 1,
orderListDetails: "$details",
orderHistory: { $ifNull: ["$orderHistory", {}] },
orderShipment: { $ifNull: [{ $arrayElemAt: ["$orderShipment", 0] }, {}] }
}
}
];