MongoDB получить результаты, где дата равна максимальной дате - PullRequest
1 голос
/ 14 февраля 2020

Предположим, у меня есть следующий документ:

[
  {
    "callId": "17dac51e-125e-499e-9064-f20bd3b1a9d8",
    "caller": {
      "firstName": "Test",
      "lastName": "Testing",
      "phoneNumber": "1231231234"
    },
    "routeHistory": [
      {
        "assignedUserId": "cfa0ffe9-c77d-4eec-87d7-4430f7772e81",
        "routeDate": "2020-01-01T06:00:00.000Z",
        "status": "routed"
      },
      {
        "assignedUserId": "cfa0ffe9-c77d-4eec-87d7-4430f7772e81",
        "routeDate": "2020-01-03T06:00:00.000Z",
        "status": "ended"
      }
    ]
  }
]

Я хочу получить результаты, где routeHistory.routeDate равно значению $ max routeDate в routeHistory. Я ожидаю, что мои результаты будут выглядеть следующим образом:

[
  {
    "callId": "17dac51e-125e-499e-9064-f20bd3b1a9d8",
    "caller": {
      "firstName": "Test",
      "lastName": "Testing",
      "phoneNumber": "1231231234"
    },
    "routeHistory": [
      {
        "assignedUserId": "cfa0ffe9-c77d-4eec-87d7-4430f7772e81",
        "routeDate": "2020-01-03T06:00:00.000Z",
        "status": "ended"
      }
    ]
  }
]

Есть ли чистый способ сделать это в одном агрегате, чтобы можно было применить дополнительные критерии $ match?

1 Ответ

1 голос
/ 14 февраля 2020

Вы можете использовать $ let для определения временной переменной $max date и использования $ filter вместе с $ arrayElemAt для получения первого соответствующего элемента:

db.collection.aggregate([
    {
        $addFields: {
            routeHistory: {
                $let: {
                    vars: {
                        maxDate: { $max: "$routeHistory.routeDate" }
                    },
                    in: {
                        $arrayElemAt: [
                            { $filter: { input: "$routeHistory", cond: { $eq: [ "$$maxDate", "$$this.routeDate" ] } } },
                            0
                        ]
                    }
                }
            }
        }
    }
])

Пн go Детская площадка

РЕДАКТИРОВАТЬ:

версия без $let:

db.collection.aggregate([
    {
        $addFields: {
            maxDate: {
                $max: "$routeHistory.routeDate"
            }
        }
    },
    {
        $addFields: {
            routeHistory: {
                $arrayElemAt: [
                    {
                        $filter: { input: "$routeHistory", cond: { $eq: [ "$$maxDate", "$$this.routeDate" ] } }
                    },
                    0
                    ]
                }
            }
        }
    }
])
...