Этот документ не соответствует, поскольку существует несоответствие между 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") ] },
]
}
}
}
])