使用MongoDB和NodeJS的“参数必须是聚合管道运算符”

时间:2020-05-23 16:55:58

标签: node.js mongodb mongoose mongodb-query

我有下面的代码可以正常工作,并显示Vote集合中MongoDB值的100条记录降序;

var myAggregate = Entry.aggregate([{ $group: { _id: "$url",author: { $first: "$author" }, vote: { $max: "$vote" }, url: { $first: "$url" }, title: { $first: "$title" } } },{ $sort:{ vote:-1} },{ $limit: 100 }]);

// Home Route
app.get('/', function(req, res) {
  myAggregate.exec(function(err, entries) {
      if (err) {
          console.log(err)
      } else {
          res.render('index', {
              entries: entries
          });
      }
  });
});

我要实现的目标是根据今天的日期过滤此数据。

我的模式如下:

{
    "_id": {
        "$oid": "5ec6efe565915b59f10787b4"
    },
    "title": "my title",
    "url": "https://myurl.com",
    "author": "john",
    "created": {
        "$date": "2020-05-22T00:17:14.340Z"
    },
    "vote": 51
}

我的索引页面应显示100条在 today 中创建的记录。

例如,如果我的条目是在今天的日期和时间范围内创建的,则应显示它。

我试图按照this问题的说明进行操作,但对我没有用。我收到了Arguments must be aggregate pipeline operators error。知道我在这里缺少什么吗?

var start = new Date();
start.setHours(0,0,0,0);

var end = new Date();
end.setHours(23,59,59,999); 

var myAggregate = Entry.aggregate([{ $group: { _id: "$url",author: { $first: "$author" }, vote: { $max: "$vote" }, url: { $first: "$url" }, title: { $first: "$title" } } },{ $sort:{ vote:-1} },{created: {$gte: start, $lt: end}},{ $limit: 100 }]);

1 个答案:

答案 0 :(得分:1)

需要注意的两件事:

  1. created既不是聚合管道中的运算符,也不是MongoDB中的运算符。

我假设您要过滤startend范围内的文档,则可以替换

{created: {$gte: start, $lt: end}}

使用

{
  $match: {
    $expr: {
      $and: [
        {
          $gte: [
            "$created",
            start
          ]
        },
        {
          $lt: [
            "$created",
            end
          ]
        }
      ]
    }
  }
}
  1. 经过仔细的查询,我发现您在聚合管道的created阶段缺少$group字段。只需添加以下内容:
created: {
  $first: "$created"
}
相关问题