Как использовать $ gte и $ lte MongoDb для даты и времени, сохраненных в виде строк в отдельных полях - PullRequest
1 голос
/ 14 июня 2019

У меня есть объекты, сохраненные в MongoDb в таком формате

{
    ...
    date: (format "dd/MM/yyyy"),
    hour: (format "hh:mm")
    ...
}

и мне нужно найти все, что после определенной даты и / или определенного часа, что-то вроде

db.inventory.find(
    { 
        date: {$gte: "20/03/2019"} 
    })

или

db.inventory.find(
    {
        hour: {$gte: "15:00"}
    })

или

db.inventory.find(
    {
        date: {$gte: "20/03/2019"},
        hour: {$gte: "15:00"}
    })

они не работают, но это идея запросов

1 Ответ

1 голос
/ 14 июня 2019

Поскольку дата и время являются строками, для правильного запроса вы можете преобразовать их в действительную дату.

Вы можете использовать агрегацию с $ project и $ dateFromString примерно так:

db.inventory.aggregate([
  {
    $project: {
      _id: 0,
      date: {
        $dateFromString: {
          dateString: { $concat: ["$date", "T", "$time"] },
          format: "%d/%m/%YT%H:%M"  // <-- specify the format for the conversion
        }
      }
    }
  },
  {
    $match: {
      date: { $gte: ISODate("2018-03-20") }  // <-- get all after 2018
    }
  }
])

Вы можете видеть это , работающий здесь

Обратите внимание, что $dateFromString - это Монго версия 3.6 и выше

Обновление

Если вам действительно нужно запросить часы / минуты, вы можете добавить другой прогноз с помощью $ dateToParts :

db.collection.aggregate([
  {
    $project: {
      _id: 0,
      date: {
        $dateFromString: {
          dateString: {
            $concat: ["$date", "T", "$time"]
          },
          format: "%d/%m/%YT%H:%M"
        }
      }
    }
  },
  {
    $project: {
      date: 1,
      parts: { $dateToParts: { date: "$date" }}
    }
  },
  {
    $match: {
      "parts.hour": {
        $gte: 10  // <-- get hours bigger or equal 10
      }
    }
  }
])

Вы можете поиграть со вторым примером и посмотреть его здесь работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...