2015-11-10 207 views
1

在以下查询中,我试图找到上周进行的articles集合中的条目,并按该文章的投票数排序。 $match似乎不工作(也许我不知道如何使用它)。下面的查询作品完美,所以它不是一个日期格式问题,使用日期聚合的Mongo查询

db.articles.find(timestamp:{ 
       '$lte':new Date(), 
       '$gte':new Date(ISODate().getTime()-7*1000*86400)} 
     }) 

但是这一次不取任何结果。如果没有$match它也会提取所需的结果(按投票计数排序的文章)。

db.articles.aggregate([ 
    { 
     $project:{ 
      _id:1, 
      numVotes:{$subtract:[{$size:"$votes.up"},{$size:"$votes.down"}]}} 
    }, 
    { 
     $sort:{numVotes:-1} 
    }, 
    { 
     $match:{ 
      timestamp:{ 
       '$lte':new Date(), 
       '$gte':new Date(ISODate().getTime()-7*1000*86400)} 
     } 
    } 
]) 

回答

2

您试图在管线末端进行匹配,这意味着您已经计划了时间戳字段,而您没有这样做。

我相信你想要的是在聚合之前过滤数据,所以你应该把匹配放在聚合数组的顶部。

试试这个:

db.articles.aggregate([{ 
    $match: { 
     timestamp: { 
      '$lte': new Date(), 
      '$gte': new Date(ISODate().getTime() - 7 * 1000 * 86400) 
     } 
    } 
}, { 
    $project: { 
     _id: 1, 
     numVotes: { 
      $subtract: [{ 
       $size: "$votes.up" 
      }, { 
       $size: "$votes.down" 
      }] 
     } 
    } 
}, { 
    $sort: { 
     numVotes: -1 
    } 
}]) 
+1

真棒!我认为命令并不重要。 –

+2

这就是他们称之为“管道”的原因。您需要将聚合视为一系列将按顺序进行的转换。您甚至可以多次投影和匹配数据。例如:你可以匹配,项目,组,项目再次,匹配,并最终排序。 –