Я хочу отфильтровать документы, которые находятся в последнюю минуту.Но следующий запрос с вычисленным временем $gte
не работает.
db.mycollection.aggregate([
{$match: {
"properties.time": {$gte: {$subtract: [ISODate(), 60000]}}
}}
])
Он ничего не возвращает, но не потому, что в последнюю минуту нет дат.Насколько я могу судить по проекции рассчитанной даты в запросах, которые работают, рассчитанная дата является правильной.Есть ли какая-то причина, по которой вы не можете использовать вычисленное значение таким образом?
Работает следующий запрос с жестко заданным временем:
db.mycollection.aggregate([
{$match: {
"properties.time": {$gte: ISODate("2018-12-26T12:00:00Z")}
}}
])
Я также рассмотрел расчет возрастав секундах, а затем фильтрация на основе этого.Следующее также работает.
db.mycollection.aggregate([
{$project: {
"properties.time": "$properties.time",
"age": {$subtract: [ISODate(), "$properties.time"]}
}},
{$match: {
"age": {$lte: 60000}
}}
])
Но это не очень хорошее решение, потому что
действительно, я хочу включить фильтр в запрос $geoNear
, ипоскольку $geoNear
должен быть первым шагом в конвейере, я не могу проецировать возраст и затем использовать его в $geoNear
Я хочу использовать индекс для "properties.time"
Мы используем eve, поэтому другим обходным путем будет преобразование запрошенного параметра max_age
в start_time
в ловушке.Но похоже, что первый подход должен сработать.