Средний по конкретному полю и конкретному году - PullRequest
1 голос
/ 05 июня 2019

У меня есть такие документы:

db.airportControl.insert({
  identification: "21c3",
  securityGateDate: new Date("2019-06-03T23:00:00Z"),
  boardingDate: new Date("2019-06-03T23:40:00Z"),
  gate: "A21",
  airportDestiny: "LAX"
});
db.airportControl.insert({
  identification: "21c3",
  securityGateDate: new Date("2019-06-04T05:00:00Z"),
  boardingDate: new Date("2018-06-04T05:21:00Z"),
  gate: "A21",
  airportDestiny: "LAX"
});
db.airportControl.insert({
  identification: "21c3",
  securityGateDate: new Date("2019-06-04T07:00:00Z"),
  boardingDate: new Date("2018-06-04T07:41:00Z"),
  gate: "A21",
  airportDestiny: "LAX"
});
db.airportControl.insert({
  identification: "21c3",
  securityGateDate: new Date("2019-06-04T07:00:00Z"),
  boardingDate: new Date("2019-06-04T07:41:00Z"),
  gate: "A21",
  airportDestiny: "TGU"
});

Я хочу знать, сколько времени пассажиры проводят в аэропортах, поскольку они проходят через ворота безопасности, пока не сядут в самолет по годам и аэропорту

У меня есть этот запрос. В среднем я получаю, сколько пассажиров тратит на аэропорт. Как я могу получить их к определенному году? Скажем, 2019:

db.airportControl.aggregate([
  { $match: { airportDestiny: "LAX" } },
  {
    $group: {
      _id: "",
      average: { $avg: { $subtract: ["$boardingDate", "$securityGateDate"] } }
    }
  }
]);

1 Ответ

2 голосов
/ 05 июня 2019

В основном вы запрашиваете два результата, которые могут быть возможны либо с помощью двух запросов, либо с помощью одной и той же вещи, например $facet.

db.collection.aggregate([
  { "$match": { "airportDestiny": "LAX" } },
  { "$facet": {
    "totalAverage": [
      { "$group": {
        "_id": null,
        "average": {
          "$avg": { "$subtract": ["$boardingDate", "$securityGateDate"] }
        }
      }}
    ],
    "averageByYear": [
      { "$match": {
        "$or": [
          { "$expr": { "$eq": [{ "$year": "$boardingDate" }, 2019] }},
          { "$expr": { "$eq": [{ "$year": "$securityGateDate" }, 2019]}}
        ]
      }},
      { "$group": {
        "_id": null,
        "average": {
          "$avg": { "$subtract": ["$boardingDate", "$securityGateDate"] }
        }
      }}
    ]
  }}
])

Обновление:

db.collection.aggregate([
  { "$match": {
    "airportDestiny": "LAX",
    "$or": [
      { "$expr": { "$eq": [{ "$year": "$boardingDate" }, 2019] }},
      { "$expr": { "$eq": [{ "$year": "$securityGateDate" }, 2019] }}
    ]
  }},
  { "$group": {
    "_id": null,
    "average": {
      "$avg": { "$subtract": ["$boardingDate", "$securityGateDate"] }
    }
  }}
])
...