Сводный запрос оболочки Mongodb, сравнивающий даты, не возвращающие результаты - PullRequest
1 голос
/ 30 апреля 2020

Я не могу определить, в чем проблема. Это ничего не возвращает

db.mycoll.aggregate([
{$project:{CreatedAt:"$CreatedAt",Now:"$$NOW",DateFloor:{$add:["$$NOW",-24*60*60000]}}},
{$match:{CreatedAt:{$gte:"$DateFloor"}}}
])

Но это возвращает результаты - замена DateFloor на фактическое значение

db.mycoll.aggregate([
{$project:{CreatedAt:"$CreatedAt",Now:"$$NOW",DateFloor:{$add:["$$NOW",-24*60*60000]}}},
{$match:{CreatedAt:{$gte: ISODate("2020-04-28T23:17:56.547Z")}}}
])

1 Ответ

1 голос
/ 30 апреля 2020

Проблема с вашим запросом возникает, когда вы делаете:

{$match:{CreatedAt:{$gte:"$DateFloor"}}}

Вы на самом деле проверяете документы, в которых CreatedAt значение поля больше значения входной строки "$DateFloor", поэтому $match не рассматривает "$DateFloor" как другое поле в том же документе, а рассматривает его как строковое значение. Поэтому для сравнения двух полей одного и того же документа вам нужно использовать $gte с $ expr (что позволит вам использовать выражения агрегации в языке запросов).

{
  $match: {
    {
      $expr: {
        $gte: ["$CreatedAt", "$DateFloor"];
      }
    }
  }
}

Так что вы можете запутайтесь, когда я скажу aggregation expressions и почему $gte нужно заключить в $expr - В вашем фактическом запросе $ gte относится к оператору сравнения в MongoDB, но в этом запросе $ gte относится к оператору конвейера агрегации, где оба технически делают то же самое, но это то, что необходимо для сравнения двух полей из одного документа.

...