Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何获得一个;top20";用猫鼬查询?_Node.js_Mongodb_Mongoose - Fatal编程技术网

Node.js 如何获得一个;top20";用猫鼬查询?

Node.js 如何获得一个;top20";用猫鼬查询?,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我有一个mongoDB数据库,用于记录web视频视图: 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

我有一个mongoDB数据库,用于记录web视频视图:

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次查询,或者一次返回所有文档,然后分组并计算自己


我是否缺少一些函数/技巧/任何允许我返回具有相同视频id的文档计数(按降序排序)的功能?

您无法使用查询聚合数据

如果要使用基本查询执行此操作,则应明确存储此信息(例如,维护视图计数器)

如果您只想保持编码风格的一致性,则可以使用以下命令重写聚合查询:

不过,它将生成相同的聚合查询

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)