Как использовать вычисленную дату в фильтре mongodb? - PullRequest
0 голосов
/ 26 декабря 2018

Я хочу отфильтровать документы, которые находятся в последнюю минуту.Но следующий запрос с вычисленным временем $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 в ловушке.Но похоже, что первый подход должен сработать.

1 Ответ

0 голосов
/ 26 декабря 2018

Вы используете агрегацию выражение внутри $match, поэтому вы должны использовать оператор $ expr , попробуйте:

db.mycollection.aggregate([
    {
        $match: {
            $expr: {
                $gte: [ "$properties.time", { $subtract: [ISODate(), 60000] } ]
            }
        }
    }
])

Вы можете использовать $ redact как запасной вариант для MongoDB ниже 3,6, попробуйте:

db.mycollection.aggregate([
    {
        $redact: {
            $cond: {
                if: { $gte: [ "$properties.time", { $subtract: [ISODate(), 60000] } ] },
                then: "$$KEEP",
                else: "$$PRUNE"
            }
        }
    }
])
...