У меня есть массив объектов, и я хочу получить последнюю созданную дату, а затем применить фильтр диапазона дат, если он попадает в эту дату, а затем посчитать его

#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. отлично!!! спасибо, как мне подсчитать количество полей, созданных последним?