使用聚合日期的Mongo查询

时间:2015-11-10 11:54:53

标签: mongodb date isodate

在以下查询中,我尝试在上周制作的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)}
        }
    }
])

1 个答案:

答案 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
    }
}])