使用聚合框架计算每天的推文和转发

时间:2017-02-21 19:17:31

标签: mongodb twitter mongodb-query aggregation-framework

我正在尝试使用mongo中的聚合框架计算每天的转推和推文数量,但我遇到了问题。我可以单独做,但当我尝试只使用查询时,我没有得到任何结果。

我使用下一个聚合框架来获取每天转发的数量

    db.tweets.aggregate(
   [
    { $match: { "retweeted_status.id": {"$exists":true} }}
     {
       $group:
         {
           _id: { 
                day2: { $dayOfMonth: "$created_ts"}, 
                month2 : {$month : "$created_ts" },
                year2: { $year: "$created_ts" },
                },
           totalReTweetsPerDay: { $sum: 1 },
         }
     },
        { $match: { "retweeted_status.id": {"$exists":true} }}
   ]
)

我使用下一个代码来获取每天的推文数量

   db.tweets.aggregate(
       [
         {
           $group:
             {
               _id: { 
                    day: { $dayOfMonth: "$created_ts"}, 
                    month : {$month : "$created_ts" },
                    year: { $year: "$created_ts" },
                    },
               totalReTweetsPerDay: { $sum: 1 },


  }
     },
     {$sort : { _id : -1}},
     {$out : "daily_tweets" }
   ]
)

我想将这两项行动合二为一。我试图加入它只有一个在另一个里面但它没有用。

非常感谢,

1 个答案:

答案 0 :(得分:1)

您可以尝试以下聚合。唯一需要注意的是ifNull运算符的包含,它检查字段是否存在。

db.tweets.aggregate(
    [{
        $group: {
            _id: {
                day: {
                    $dayOfMonth: "$created_ts"
                },
                month: {
                    $month: "$created_ts"
                },
                year: {
                    $year: "$created_ts"
                },
            },
            totalReTweetsPerDay: {
                $sum: {
                    $cond: [{
                        $ifNull: ["$retweeted_status.id", false]
                    }, 1, 0]
                }
            },
            totalTweetsPerDay: {
                $sum: 1
            }
        }
    }, {
        $sort: {
            _id: -1
        }
    }, {
        $out: "daily_tweets"
    }]
)