Mongodb (v2.4.0) $ match aggregate не работает с диапазоном дат

Я использую java-драйвер mongodb через репозиторий maven (как показано ниже в pom.xml) для запроса транзакций между диапазоном дат с агрегированным фреймворком. Драйвер java генерирует следующее совпадение $, которое я пытался проверить на консоли mongo и обнаружил, что он не работает:

db.transactions.aggregate(
{ "$match" : 
    { 
        "created_at" : { "$gt" : { "$date" : "2001-04-12T12:00:00.000Z"} , "$lte" : { "$date" : "2020-04-13T12:00:00.000Z"}}
    }
}
)

Если я удалю блок $ date и заменю его функцией ISOdate и строкой даты, похоже, он работает. Мне не удалось понять, почему он не работает в java ($ match JSON - я получил из eclipse, чтобы попробовать в консоли mongo, и это тоже не работает.)

pom.xml
<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongo-java-driver</artifactId>
    <version>2.11.0</version>
</dependency>

Кто-нибудь знает, почему $ date не работает с агрегатом с использованием MongoDB v2.4.0?


person Jaymin    schedule 13.04.2013    source источник
comment
Попробуйте ответить и дайте мне знать, если это не сработает ... и если это не сработает, предоставьте нам информацию о хранилище данных в базе данных. поскольку я предполагал, что date - это встроенное поле created_at в вашем документе.   -  person Amol M Kulkarni    schedule 18.04.2013
comment
Я пробовал, но не работает. Предоставленный мной код был сгенерирован java-драйвером MongoDB, поэтому я не вижу проблемы. created_at - поле даты и содержит формат даты ISO. Пожалуйста, найдите JSON ниже для справки: {created_at: ISODate (2013-04-18T10: 42: 22Z), payment_token: f7e595ec-1cdd-4e5d-93c5-eca8e5f9f876}   -  person Jaymin    schedule 25.04.2013
comment
Я обновил свой ответ со ссылкой на предоставленный вами JSON. Пожалуйста, дайте нам знать. Поскольку тот же код работает у меня с MongoDB 2.2.3, я надеюсь, что он работает и с вашей версией без проблем.   -  person Amol M Kulkarni    schedule 26.04.2013
comment
нет, не работает. Я использую mongodb-win32-x86_64-2.4.0 (т.е. v2.4.0)   -  person Jaymin    schedule 27.04.2013
comment
Извините, на основе прошлых преобразований я не получаю никаких подсказок для решения ... Но наверняка приведенный ниже код действительно работает на моей машине   -  person Amol M Kulkarni    schedule 27.04.2013
comment
При дальнейшем анализе кажется, что проблема не в запросе, а в том, как дата хранится в БД. Ссылка # github.com/lordofthejars/nosql-unit/issues/ и jira .mongodb.org / browse /. Однако, в примере в последней ссылке, когда я пытаюсь вставить дату в БД, она вставляется с ISODate в формате $ date. Но println сериализации печатает требуемый формат, то есть с $ date. Не уверен, почему вставка БД не вставляется должным образом.   -  person Jaymin    schedule 07.05.2013
comment
@Jaymin Удалось ли вам выяснить проблему с запросом диапазона дат при агрегировании? Мои исследования показывают, что если вы используете запрос как часть поиска, он работает. При использовании в конвейере агрегации выдает синтаксические ошибки.   -  person vinay    schedule 10.03.2015


Ответы (2)


Вы должны отформатировать дату, прежде чем переходить к агрегату $ match.

Order.aggregate([
        {
          $match: {
            createdAt: {
              $gte: new Date(req.body.startDate),
              $lt: new Date(req.body.endDate)
            }
          }
        },
        {
          $lookup: {
            from: 'acbinstallerpayments',
            localField: "_id",
            foreignField: 'customerObjectID',
            as: 'installerPaymentDetails'
          }
        }
      ]);
person Sunilkumar A    schedule 28.08.2019
comment
Спасибо, это сработало. Создание объекта даты при отправке даты работает нормально. - person Parth Mansata; 27.04.2021

Я решил это, удалив префикс "" & $ в поле $date в $match. Ибо вы удалите то же самое для $date, $gt & $lte

Чтобы это выглядело так

db.transactions.aggregate(
{ "$match" : 
         { 
          'created_at': { 
                         $gt: "2001-04-12T12:00:00.000Z", 
                         $lt: "2020-04-13T12:00:00.000Z"
                        }
         }
});
person Amol M Kulkarni    schedule 18.04.2013
comment
Я использую CFMongoDB (ColdFusion) с Java-драйвером Mongo, и этот формат работал. Мне пришлось добавить кавычки вокруг "$gt" & "$lt", но это могло быть просто требованием ColdFusion. (ПРИМЕЧАНИЕ: действительный JSON требует двойных кавычек. Возможно, драйвер java в настоящее время не заботится о нем, но может в будущем.) - person James Moberg; 20.11.2013