2

在以下查询中,我试图查找articles上周在我的收藏中创建的条目,按该文章的投票数排序。$match似乎不起作用(也许我不知道如何使用它)。以下查询完美运行,因此不是日期格式问题,

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)}
        }
    }
])
4

1 回答 1

3

您正在尝试在管道的末尾进行匹配,这假设您已经投影了时间戳字段,而您还没有这样做。

我相信您想要的是在聚合之前过滤数据,因此您应该将匹配放在聚合数组的顶部。

试试这个:

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
    }
}])
于 2015-11-10T12:32:04.337 回答