0

我正在制作一个航空公司虚拟网站,我需要获取所有航空公司每个航班的所有已售机票,我有 3 个集合:航空公司、航班和销售

我尝试在 mongodb 查询中使用嵌套查找,但我无法计算总票数,这是当前查询和结果:

Airline.aggregate([{
  $lookup: {
    from: "flights",
    localField: "id_airline",
    foreignField: "id_airline",
    as: "flights"
  }
}, {
  $unwind: {
    path: "$flights",
    preserveNullAndEmptyArrays: true
  }
}, {
  $lookup: {
    from: "sales",
    localField: "flights.id_flight",
    foreignField: "id_flight",
    as: "flights.sales",
  }
}, {
  $group: {
    _id : "$_id",
    idAirline: { $first: "$id_airline" },
    flights: { $push: "$flights" }
  }
}, {
  $project: {
    _id: 1,
    idAirline: 1,
    "flights.id_flight": 1,
    "flights.price": 1,
    "flights.sold":{$sum:"$flights.sales.tickets"}
  }
}]

结果是:

... },
    {
        "_id": "5db381cb18518043c40e3ecd",
        "idAirline": "AVI-242",
        "flights": [
            {
                "id_flight": "CPA-001",
                "price": "125",
                "sold": 0
            },
            {
                "id_flight": "CGA-002",
                "price": "150",
                "sold": 0
            },
            {
                "id_flight": "CHA-003",
                "price": "135",
                "sold": 0
            }
        ]
    },
....

实际上,fligth CPA-001 已售出 6 张门票,但我无法得出结果。

以下是文件:

航空公司

{"_id":{"$oid":"5db3823718518043c40e3ece"},"country":["Panamá","El Salvador","Belice"],"id_airline":"VOL-643","name_airport":"Juan Santamaría","name_airline":"Volaris","createdAt":{"$date":{"$numberLong":"1572045367094"}},"updatedAt":{"$date":{"$numberLong":"1572045367094"}},"__v":{"$numberInt":"0"}}

航班

{"_id":{"$oid":"5db9a225154a1b1b08cc77c3"},"restrictions":["No Liquids"],"features":[],"id_flight":"CPA-001","id_airline":"AVI-242","date_departure":{"$date":{"$numberLong":"1546300800000"}},"date_arrival":{"$date":{"$numberLong":"1559779200000"}},"name":"CosPan","origin":"Costa Rica","destination":"Panamá","itinerary":"50 breakfasts","price":"125","status":"On Time","max_capacity":"50","createdAt":{"$date":{"$numberLong":"1572446757327"}},"updatedAt":{"$date":{"$numberLong":"1572447464367"}},"__v":{"$numberInt":"0"}}

销售量

{"_id":{"$oid":"5db9b643b50c0d1540b8db89"},"id_user":"304780391","id_flight":"CPA-001","origin":"Costa Rica","destination":"Panamá","date_departure":{"$date":{"$numberLong":"1546300800000"}},"date_arrival":{"$date":{"$numberLong":"1559779200000"}},"tickets":{"$numberInt":"4"},"suitcases":{"$numberInt":"1"},"status":"Bought","seat":{"$numberInt":"-1"},"createdAt":{"$date":{"$numberLong":"1572451907375"}},"updatedAt":{"$date":{"$numberLong":"1572451907375"}},"__v":{"$numberInt":"0"}}
4

1 回答 1

0

我认为嵌套数组造成了一些困难。我在 $lookup 和 $group 之间添加了另一个 $unwind。让我知道你的想法...

db.airlines.aggregate([
  { $lookup: {
      from: "flights",
      localField: "id_airline",
      foreignField: "id_airline",
      as: "flights"
    }
  },
  { $unwind: {
      path: "$flights",
      preserveNullAndEmptyArrays: true
    }
  },
  { $lookup: {
      from: "sales",
      localField: "flights.id_flight",
      foreignField: "id_flight",
      as: "flights.sales",
    }
  },
  { $unwind: {
      path: "$flights.sales",
      preserveNullAndEmptyArrays: true
    }
  },
  { $group: {
      _id : "$_id",
      idAirline: { $first: "$id_airline" },
      flights: { $push: "$flights" }
    }
  },
  { $project: {
      _id: 1,
      idAirline: 1,
      "flights.id_flight": 1,
      "flights.price": 1,
      "flights.sold":{$sum: "$flights.sales.tickets"}
    }
  }
]).pretty()

用于测试的文件:

航班

{
    "_id" : ObjectId("5db9a225154a1b1b08cc77c3"),
    "restrictions" : [
        "No Liquids"
    ],
    "features" : [ ],
    "id_flight" : "CPA-001",
    "id_airline" : "VOL-643",
    "date_departure" : ISODate("2019-10-30T23:04:17.119Z"),
    "date_arrival" : ISODate("2019-10-30T23:04:17.119Z"),
    "name" : "CosPan",
    "origin" : "Costa Rica",
    "destination" : "Panamá",
    "itinerary" : "50 breakfasts",
    "price" : "125",
    "status" : "On Time",
    "max_capacity" : "50",
    "createdAt" : ISODate("2019-10-30T23:04:17.119Z"),
    "updatedAt" : ISODate("2019-10-30T23:04:17.119Z"),
    "__v" : {
        "$numberInt" : "0"
    }
}

航空公司

{
    "_id" : ObjectId("5db3823718518043c40e3ece"),
    "country" : [
        "Panamá",
        "El Salvador",
        "Belice"
    ],
    "id_airline" : "VOL-643",
    "name_airport" : "Juan Santamaría",
    "name_airline" : "Volaris",
    "createdAt" : ISODate("2019-10-30T23:04:17.119Z"),
    "updatedAt" : ISODate("2019-10-30T23:04:17.119Z"),
    "__v" : {
        "$numberInt" : "0"
    }
}

销售量

[{
    "_id" : ObjectId("5db9b643b50c0d1540b8db89"),
    "id_user" : "304780391",
    "id_flight" : "CPA-001",
    "origin" : "Costa Rica",
    "destination" : "Panamá",
    "date_departure" : ISODate("2019-10-30T23:04:17.119Z"),
    "date_arrival" : ISODate("2019-10-30T23:04:17.119Z"),
    "tickets" : 4,
    "suitcases" : {
        "$numberInt" : "1"
    },
    "status" : "Bought",
    "seat" : -1,
    "createdAt" : ISODate("2019-10-30T23:04:17.119Z"),
    "updatedAt" : ISODate("2019-10-30T23:04:17.119Z"),
    "__v" : {
        "$numberInt" : "0"
    }
},
{
    "_id" : ObjectId("5db9b643b50c0d1540b8db8a"),
    "id_user" : "304780391",
    "id_flight" : "CPA-001",
    "origin" : "Costa Rica",
    "destination" : "Panamá",
    "date_departure" : ISODate("2019-10-30T23:04:17.119Z"),
    "date_arrival" : ISODate("2019-10-30T23:04:17.119Z"),
    "tickets" : 4,
    "suitcases" : {
        "$numberInt" : "1"
    },
    "status" : "Bought",
    "seat" : -1,
    "createdAt" : ISODate("2019-10-30T23:04:17.119Z"),
    "updatedAt" : ISODate("2019-10-30T23:04:17.119Z"),
    "__v" : {
        "$numberInt" : "0"
    }
}]
于 2019-10-30T23:35:14.803 回答