代码之家  ›  专栏  ›  技术社区  ›  Apoorva

多字段$lookup

  •  2
  • Apoorva  · 技术社区  · 6 年前

    我有两个集合,并试图在两个不同的条件下得到总额。
    Heere是我的代码:

    db.drivers.aggregate([
      {
        $lookup: {
          from: "bookings",
          let: { driver_id: "$_id" },
          pipeline: [
            { $match: { $expr: { $eq: ["$driverId", "$$driver_id"] } } },
            {
              $group: {
                _id: "$driverId",
                totalAmount: { $sum: "$driverAmount" }
              }
            }
          ],
          as: "bookingdata",
          pipeline: [
            {
              $match: {
                $expr: {
                  $and: [
                    { $eq: ["$driverId", "$$driver_id"] },
                    { $eq: ["$payment.settled", false] }
                  ]
                }
              }
            },
            {
              $group: {
                _id: "$driverId",
                totaldues: { $sum: "$driverAmount" }
              },
              bookingdata: {
                $push: "$totaldues"
              }
            },
            { $project: { _id: 0, totalAmount: 1, totaldues: 1 } }
          ]
        }
      }
    ]);
    

    其结果要么是总金额,要么是总应付款,但不能两者兼而有之。如何获取驾驶员详细信息以及总金额和总费用?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Ashh    6 年前

    不能在同一对象中多次使用同一字段 pipeline 在这里。

    代替使用 $facet 内部聚合 $lookup 一次处理多条管道。

    db.drivers.aggregate([
      { "$lookup": {
        "from": "bookings",
        "let": { "driver_id": "$_id" },
        "pipeline": [
          { "$facet": {
            "totaldues": [
              { "$match": {
                "$expr": {
                  "$and": [
                    { "$eq": ["$driverId", "$$driver_id"] },
                    { "$eq": ["$payment.settled", false] }
                  ]
                }
              }},
              { "$group": {
                "_id": "$driverId",
                "totaldues": { "$sum": "$driverAmount" },
                "bookingdata": { "$push": "$totaldues" }
              }},
              { "$project": { "_id": 0, "totalAmount": 1, "totaldues": 1 } }
            ],
            "totalAmount": [
              { "$match": { "$expr": { "$eq": ["$driverId", "$$driver_id"] } }},
              { "$group": {
                "_id": "$driverId",
                "totalAmount": { "$sum": "$driverAmount" }
              }}
            ]
          }}
        ],
        "as": "bookingdata"
      }}
    ])