关于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了,想请教这里应该怎么处理,求有经验的大神帮帮忙
小弟感激不尽
No Comments