#mongodb #mongodb-query
#mongodb #mongodb-запрос
Вопрос:
{
"_id" : ObjectId("61a765e6f664eb8f6b12c"),
"details" : [
{
"_id" : ObjectId("60c84d9968c2d100154f3391"),
"expiryDate" : ISODate("2021-06-12T05:30:00.000Z"),
"updatedAt" : ISODate("2021-06-15T06:50:01.046Z"),
"createdAt" : ISODate("2021-06-10T06:50:01.046Z")
},
{
"_id" : ObjectId("60c84d99c2d100154f3391"),
"expiryDate" : ISODate("2021-06-25T05:30:00.000Z"),
"updatedAt" : ISODate("2021-06-15T06:50:01.046Z"),
"createdAt" : ISODate("2021-06-16T06:50:01.046Z")
},
{
"_id" : ObjectId("60c84d9968c20154f3391"),
"expiryDate" : ISODate("2021-06-25T05:30:00.000Z"),
"updatedAt" : ISODate("2021-06-15T06:50:01.046Z"),
"createdAt" : ISODate("2021-06-15T06:50:01.046Z")
}
]
}
Как я могу написать запрос mongo для сортировки и получения последней даты, а затем применить к нему фильтр диапазона дат
Ответ №1:
Вы можете $addFields
использовать вспомогательное поле lastCreatedAt
, используя $max
. Затем $match
к полю в конвейере агрегации.
db.collection.aggregate([
{
"$addFields": {
"lastCreatedAt": {
$max: "$details.createdAt"
}
}
},
{
"$match": {
lastCreatedAt: {
// input your date range here
$gte: ISODate("2012-06-16T06:50:01.000Z"),
$lt: ISODate("2021-12-30T06:50:01.100Z")
}
}
},
{
$group: {
_id: null,
docs: {
$push: "$ROOT"
},
numOfLastCreatedAt: {
$sum: 1
}
}
}
])
Вот игровая площадка Mongo для вашей справки.
Комментарии:
1. это работает только для одного объекта, у меня есть 100 массивов _id и соответствующих сведений, и я применяю то же самое ко всем из них
2. Что вы подразумеваете под работами для одного объекта ? Можете ли вы уточнить больше, предоставив тестовые примеры и ожидаемый результат?
3. mongoplayground.net/p/liAn283BS3m смотрите, как я добавил еще один объект, поэтому для 2 объектов должно быть 2 поля lastCreatedAt
4. Речь идет о вводе диапазона дат. На вашей игровой площадке требуется более полный ввод диапазона дат, чтобы включить тестовый пример 2021-12-30. Проверьте это .
5. отлично!!! спасибо, как мне подсчитать количество полей, созданных последним?