Запрос mongoDB для даты между двумя датами пропускает некоторые документы - PullRequest
0 голосов
/ 11 ноября 2018

У меня есть следующий документ в названии коллекции chats:

{
    "_id" : 25281,
    "conversation" : [ 
        {
            "time" : "1970-01-18T20:16:28.988Z"
        }, 
        {
            "time" : "2018-11-09T18:43:09.297Z"
        }
    ],
}

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

Вот запрос:

db.getCollection('chats').find({"conversation.1.time": 
    { 
        "$gte": ISODate("2018-11-09T00:00:00.000Z"), 
        "$lt": ISODate("2018-11-10T00:00:00.000Z")
    }  
})

1 Ответ

0 голосов
/ 11 ноября 2018

Этот документ не соответствует, поскольку существует несоответствие между ISODate, указанным в вашем запросе, и string в вашей модели данных. MongoDB проверяет типы перед значениями, поэтому вы не получаете значений. От документов

Однако для большинства типов данных операторы сравнения выполняют сравнения только с теми документами, в которых тип BSON целевого поля соответствует типу операнда запроса.

Есть три способа это исправить. Вы можете изменить тип в вашем запросе:

db.getCollection('chats').find({"conversation.1.time": 
    { 
        "$gte": "2018-11-09T00:00:00.000Z", 
        "$lt": "2018-11-10T00:00:00.000Z"
    }  
})

или вам нужно преобразовать данные в chats:

{
    "_id" : 25281,
    "conversation" : [ 
        {
            "time" : ISODate("1970-01-18T20:16:28.988Z")
        }, 
        {
            "time" : ISODate("2018-11-09T18:43:09.297Z")
        }
    ],
}

В качестве альтернативы вы можете взглянуть на оператор $ toDate в Aggregation Framework (представлен в MongoDB 4.0):

db.getCollection('chats').aggregate([
    {
        $addFields: {
            value: { $arrayElemAt: [ "$conversation", 1 ] }
        }
    },
    {
        $match: {
            $expr: {
                $and: [
                    { $gte: [ { $toDate: "$value.time" }, ISODate("2018-11-09T00:00:00.000Z") ] },
                    { $lt: [ { $toDate: "$value.time" }, ISODate("2018-11-10T00:00:00.000Z") ] },
                ]
            }
        }
    }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...