在以下查询中,我尝试在上周制作的articles
集合中查找条目,并按该文章的投票数排序。 $match
似乎不起作用(也许我不知道如何使用它)。以下查询完美无缺,因此它不是日期格式问题,
db.articles.find(timestamp:{
'$lte':new Date(),
'$gte':new Date(ISODate().getTime()-7*1000*86400)}
})
但是这个没有取得任何结果。如果没有$match
,它也会获取所需的结果(按照votecount排序的文章)。
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)}
}
}
])
答案 0 :(得分: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
}
}])