有没有人有一个在 PHP 中运行具有 DISTINCT 计数的组函数的好方法?情况是这样的:我想检查我们应用程序的唯一登录。这是我正在查询的当前集合中的文档的样子:
Array
(
[_id] => MongoId Object
(
[$id] => 50f6da87686ba9f449000003
)
[userId] => 50f6bd0f686ba91a4000000f
[action] => login
[time] => 1358355079
我想做的是通过按日期的组语句计算唯一的用户 ID。这是我正在使用的组语句(在 PHP 中):
$map= new MongoCode('function(frequency) {
var date = new Date(Number(frequency.time) * 1000 - (8 * 3600000));
var dd = date.getDate();
var yyyy = date.getFullYear();
var mm = date.getMonth() + 1;
if(dd<10){dd="0"+dd}
if(mm<10){mm="0"+mm}
var transday = yyyy + "-"+ mm + "-" + dd;
return{"date": transday}
}');
$initial = array('logins' => array());
$reduce = "function(obj, prev){
prev.logins.push(obj.userId);
}";
try{
$distinct = array();
$g = $this->_bingomongo->selectCollection("UserLog")->group($map, $initial, $reduce);
从这一点开始,我只是array_unique
在记忆中做一个......但我真正想做的(并且在网上找不到好的答案)是在 group by 中运行一个不同的计数。我已经看到了其他几个我们可以使用 an 的例子,array(distinct=>'key')
但我希望做一个计数。有什么想法吗?
这是当前(不完美)格式的其余代码:
foreach($g['retval'] as $k=>$v) {
$distinct[date('m.d', strtotime($v['date']))] = array_unique($v['logins']);
}
}
catch(Exception $e) {
return $e;
} return $g;
如果绝对必要,很高兴在 map/reduce 中执行此操作 - 但宁愿找到一种方法将其保持在组中(作为 COUNT(distinct))。