关于Laravel的Mongo包聚合查询问题【急】


这阵子刚接触Laravel的mongo,很多东西不是很明白,特向各位大佬请教
业务需求:
Mongodb存储用户登录日志,定时从日志内汇总各产品的登录情况,以下为Mongo集合存储的格式:

{
    "_id" : ObjectId("5b221871ec6f0d72ff7c9e96"),
    "user_id" : 302015,
    "game_id" : "4",
    "channel_id" : "Test",
    "create_time" : 1528961123,
    "create_date" : 1528934400,
    "log_time" : 1528961137
},
{
    "_id" : ObjectId("5b221913ec6f0d72ff7c9e97"),
    "user_id" : 302013,
    "game_id" : "4",
    "channel_id" : "Test",
    "create_time" : 1528961123,
    "create_date" : 1528934400,
    "log_time" : 1528961137
}

以上为示例数据,在Mongodb中我使用以下查询能正常查询出结果集:

db.getCollection('log_login').aggregate([
     { "$group" : { "_id" : { "game_id":"$game_id", "channel_id":"$channel_id", "user_id":"$user_id"} , "login_num":{ "$sum" : 1 } } },
     { "$group" : { "_id" : {"game_id":"$_id.game_id", "channel_id":"$_id.channel_id"} , "login_people":{ "$sum" : 1 }, "login_num":{"$sum":"$login_num"} } }
]);

注意在查询语句中我用了两个$group来过滤数据,目的其实就是想去重$user_id,达到distinct的目的

该查询能正常得到以下结果(示例内容):
{
"_id" : {
"game_id" : "0",
"channel_id" : "0"
},
"login_people" : 1.0,
"login_num" : 2.0
}

在Laravel中使用Model调用时查询到这样子使用管理方法:

$result = LogLogin::raw(function($logLogin){
            return $logLogin->aggregate([
                [
                    '$group' => [
                        '_id' => ['game_id' => '$game_id', 'user_id' => '$user_id'], 'login_people' => ['$sum' => 1]
                    ]
                ],
            ]);
        });
dd($result->toArray());

现在的问题是在aggregate方法内的数组里,$group由于是数组里的键,但我的查询里是有两个$group的,我如果再添加一条的话在PHP里实际上就是直接覆盖$group了,想请教这里应该怎么处理,求有经验的大神帮帮忙
小弟感激不尽


点赞 取消点赞 收藏 取消收藏

<< 上一篇: laravel5.6在routes/api.php中重定向

>> 下一篇: laravel使用find_in_set