如何在mongodb上获取每个用户的帖子数?

时间:2017-02-08 12:47:05

标签: mongodb aggregation-framework

如何在mongodb上获取每个用户的帖子数量?我有一个类似下面的数据集

{ "_id" : ObjectId("58863104f9881947d6d328c3"), 
  "time" : 1484755908748,
  "user" : "mjt",
  "post" : "lorem ipsum...."
},
{ "_id" : ObjectId("58863104f9881947d6d328c3"), 
  "time" : 1484755908748,
  "user" : "joe",
  "post" : "lorem ipsum...."
}
....

简单的尝试我做了但是给出了错误

db.collection.aggregate([ 
  { $project: {user:1, 
    isoTime : {$dayOfMonth : {$add : [new Date(0),"$time"]}} }}, 
    {$group : {_id:"$isoTime", count: {$sum:1}}} 
])

这给出了错误:

"ok" : 0,
"errmsg" : "can't convert from BSON type null to Date",
"code" : 16006,
"codeName" : "Location16006"

2 个答案:

答案 0 :(得分:1)

您实际上需要为具有time字段(即它不为空)的文档过滤您的集合,其中类型为NOT的日期,然后使用<每个用户每天分组strong> $dateToString 运算符,它生成一个表示日期的格式化日期时间字符串。

运行以下聚合操作以获取每天的帖子次数

db.collection.aggregate([ 
    { "$match": { "time": { "$exists": true, "$not": { "$type": 9 } } } },
    {
        "$group": {
            "_id": {
                "$dateToString": {
                    "format": "%Y-%m-%d", 
                    "date": { "$add": [new Date(0), "$time"] }
                }
            },
            "count": { "$sum": 1 } 
        }
    } 
])

此管道应该为您提供每位用户每天的帖子数量以及当天的总体帖子数:

db.collection.aggregate([ 
    { "$match": { "time": { "$exists": true, "$not": { "$type": 9 } } } },
    {
        "$group": {
            "_id": {
                "user": "$user",
                "yearMonthDay": {   
                    "$dateToString": {
                        "format": "%Y-%m-%d", 
                        "date": { "$add": [new Date(0), "$time"] }
                    }
                }
            },
            "count": { "$sum": 1 } 
        }
    },
    {
        "$group": {
            "_id": "$_id.yearMonthDay",
            "userCounts": {
                "$push": {
                    "user": "$_id.user",
                    "count": "$count"
                }
            },
            "total": { "$sum": "$count" }
        }
    }
])

答案 1 :(得分:0)

您论坛中的某些文件的time等于null。将null转换为Date时,会出现此错误。只需使用$ match stage过滤掉这些文档(在其他阶段之前添加):

{ $match: { time: {$type: 9}}}

9是BSON type Date的值。