Как использовать $ gte и $ lte между датами с помощью `$ filter` - PullRequest
0 голосов
/ 14 мая 2018

У меня есть запрос кода $gte дата, он отлично работает.

cityCollection.aggregate([
    { 
      "$project": { 
          theater: true,
          movie: {
            $filter: {
              input: {
                $map: {
                  input: "$movie",
                  as: "movie",
                  in: {
                      cnName: "$$movie.cnName",
                      enName: "$$movie.enName",
                      releasedTime: {
                        $filter: {
                          input: "$$movie.releasedTime",
                          as: "movie",
                          cond: { $and:{
                            $gte: [ "$$movie", new Date(`${today} 20:00:00.000Z`) ]
                          }}
                        }
                      }
                  }
                }
              },
              as: "movie",
              cond: "$$movie"
            }
          }
      }
    }
])
    .then(drivers => res.send(drivers))
    .catch(next);

Теперь я хочу сделать запрос между двумя датами, я пытаюсь добавить $lte в свой код следующим образом:

releasedTime: {
   $filter: {
      input: "$$movie.releasedTime",
      as: "movie",
      cond: {
        $gte: [ "$$movie", new Date(`${today} 20:00:00.000Z`) ],
        $lte: [ "$$movie", new Date(`${today} 22:00:00.000Z`) ] 
      }
   }
}

Но я получаю ошибку:

{
    "error": "An object representing an expression must have exactly one field: { $gte: [ \"$$movie\", new Date(1526328000000) ], $lte: [ \"$$movie\", new Date(1526335200000) ] }"
}

Я ищу какое-то решение, найдите $and, поэтому я пытаюсь добавить $and в свой код следующим образом:

releasedTime: {
  $filter: {
    input: "$$movie.releasedTime",
    as: "movie",
    cond: { $and:{
      $gte: [ "$$movie", new Date(`${today} 20:00:00.000Z`) ],
      $lte: [ "$$movie", new Date(`${today} 22:00:00.000Z`) ] 
    }}
  }
}

Это все еще показывает ту же ошибку, я понятия не имею, чтошаг, если я попробую.

Любая помощь будет оценена.Заранее спасибо.

1 Ответ

0 голосов
/ 14 мая 2018

Это скобки [], а не скобки {}, главным образом потому, что это «массив условий» в контексте использования агрегации.

releasedTime: {
  $filter: {
    input: "$$movie.releasedTime",
    as: "movie",
    cond: { $and:[
      { $gte: [ "$$movie", new Date(`${today} 20:00:00.000Z`) ] },
      { $lt: [ "$$movie", new Date(`${today} 22:00:00.000Z`) ] }
    ]}
  }
}

На самом деле есть примеры на $and (агрегация) в документации.Например, прямо здесь

Также обратите внимание, что вы обычно имеете в виду $lt, когда хотите «до» определенного диапазона значений.Всегда ставьте «меньше» «следующего наивысшего значения», а не включайте «максимально возможное».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...