我有一个记录网络视频视图的mongoDB数据库:
S_logs = new mongoose.Schema({
video_id : String,
time : Number //timestamp of when the video was saw
});
M_logs = mongoose.model('logs', S_logs);
我需要获得观看次数最多的视频的前20名,我可以使用聚合获得它:
M_logs.aggregate([
{
"$match" : {
"time" : {
"$gt" : time_lower_bound,
"$lt" : time_upper_bound
}
}
},
{
"$group" : {
"_id" : "$video_id",
"count" : { "$sum" : 1 }
}
},
{
"$sort" : { "count" : -1 }
}
]).limit(20);
}
哪个工作,但为了保持一致(它将是我的代码中我使用聚合而不是查询的唯一地方),我也想使用查询,我想出了:
M_logs[from] .find()
.select('video_id') //Get all video_id
.where('time') //in the selected timespan
.gt(time_lower_bound)
.lt(time_upper_bound)
.sort('video_id') //sort them
.distinct('video_id')//get only the video_id list
.limit(20); //get only the first 20 to appear
但我明白了:
Error: field selection and slice cannot be used with distinct
我以为我可以用某种方式使用count,但它只返回查询返回的文档总数。
对我来说,似乎如果我想用查询来做这个,我可以选择制作20个查询,或者一个将返回所有文档,然后分组并计算自己。
我是否遗漏了一些函数/技巧/任何允许我返回具有相同video_id的文档计数的内容,按降序排序?
答案 0 :(得分:1)
您无法使用查询汇总数据。
如果您想使用基本查询,则应明确存储此信息(例如维护视图计数器)。
如果你想要的只是编码风格的一致性,那么你可以用mongoose aggregation dsl重写聚合查询:
M_logs.aggregate().match({
time: {
$gt: time_lower_bound,
$lt: time_upper_bound
}
}).group({
_id: "$video_id",
count : { $sum: 1 }
}).sort({
count: -1
}).limit(20)
但是,它会产生相同的聚合查询。