复合键查找在 mongoDb 中无法按预期工作

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

我想使用聚合根据详细信息下(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
进行搜索。

javascript node.js mongodb nosql backend
1个回答
0
投票

首先,我认为你打错了

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] }, {}] }
        }
    }
];
© www.soinside.com 2019 - 2024. All rights reserved.