如何使用mongoose查询获得“top20”?

时间:2014-08-26 10:00:40

标签: node.js mongodb mongoose

我有一个记录网络视频视图的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的文档计数的内容,按降序排序?

1 个答案:

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

但是,它会产生相同的聚合查询。