如何在日期之间使用 $gte 和 $lte 以及 `$filter`

Mor*_*ton 1 mongodb aggregation-framework

我有一个代码查询$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);
Run Code Online (Sandbox Code Playgroud)

现在我想在两个日期之间查询,我尝试$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`) ] 
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

但我收到错误:

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

我正在寻找一些解决方案$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`) ] 
    }}
  }
}
Run Code Online (Sandbox Code Playgroud)

它仍然显示相同的错误,我不知道应该尝试什么步骤。

任何帮助,将不胜感激。提前致谢。

Nei*_*unn 5

它是方括号[]而不是大括号{},主要是因为它是聚合使用上下文中的“条件数组”。

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`) ] }
    ]}
  }
}
Run Code Online (Sandbox Code Playgroud)

文档中的$and(聚合)实际上有示例。比如这里

另请注意,您通常指的是$lt当您想要“最多”特定范围金额时。始终“小于”“下一个最高值”,而不是包含“可能的最大值”。