У меня похожий вопрос.
Сначала сортировка, а затем проецирование последней не работает в моем случае, потому что мне нужно вывести более одного завершенного времени.
Вот мой вопрос, кроме использования функции $ unwind, есть ли другие способы обработки этого массива в документах?
Причина, по которой я не хочу использовать $ unwind, - это деконструкция поля массива для вывода документа для каждого элемента, и у меня есть несколько фильтров, применяемых к запросу, и это увеличит общее количество записей досоответствовать другим фильтрам.
Это мои примеры записей
"_id" : ObjectId("5d9b69fae4757402b4b4ca0d"),
"status_changed_utc" : [
{
"status" : NumberInt(1),
"time" : ISODate("2019-05-20T23:03:10.000+0000")
},
{
"status" : NumberInt(2),
"time" : ISODate("2019-05-23T23:04:03.000+0000")
},
{
"status" : NumberInt(4),
"time" : ISODate("2019-05-23T23:05:06.000+0000")
},
{
"status" : NumberInt(5),
"time" : ISODate("2019-05-23T23:05:07.000+0000")
},
{
"status" : NumberInt(6),
"time" : ISODate("2019-05-23T23:05:09.000+0000")
}
],
"requested_completion_utc" : ISODate("2019-05-22T23:05:09.000+0000")
Когда я пытаюсь использовать этот запрос
db.getCollection("test").aggregate(
[
{
"$match" : {
"requested_completion_utc" : {
"$exists" : 1.0
}
}
},
{
"$project" : {
"_id" : 1.0,
"requested_completion_utc" : 1.0,
"status_changed_utc" : {
"$slice" : [
"$status_changed_utc",
-1.0
]
}
}
}
]
Он вернет мне этот результат.
{
"_id" : ObjectId("5d9b69fae4757402b4b4ca0d"),
"requested_completion_utc" : ISODate("2019-05-22T23:05:09.000+0000"),
"status_changed_utc" : [
{
"status" : NumberInt(6),
"time" : ISODate("2019-05-23T23:05:09.000+0000")
}
]
}
Возможно ли вернуть статус NumberInt (2) вместо NumberInt (6), который является для меня последним завершенным статусом?
Это то, что я ожидал, результат
{
"_id" : ObjectId("5d9b69fae4757402b4b4ca0d"),
"requested_completion_utc" : ISODate("2019-05-22T23:05:09.000+0000"),
"status_changed_utc" : [
{
"status" : NumberInt(2),
"time" : ISODate("2019-05-23T23:04:03.000+0000")
}
]
}