MongoDB GROUP函数(或Map Reduce,如有必要)与PHP-Distinct keys



有没有人有很好的方法来在PHP中运行具有DISTINCT count的组函数?情况是这样的:我想检查我们应用程序的唯一登录名。以下是我正在查询的当前集合中的文档的外观:

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......但我真正想做的(并且在网上找不到好的答案)是在分组中运行一个不同的计数。我已经看到了其他几个例子,我们可以使用 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(独特))。

你应该能够做这样的事情:

...
$initial = array('logins' => array());
$reduce = "function(obj, prev){
               prev.logins[obj.userId] = 1;
           }";
$finalize = "function(result) {
                 result.loginList = Object.keys(result.logins);
                 result.count = result.loginList.length;
            }";
try{
    $distinct = array();
    $g = $this->_bingomongo->selectCollection("UserLog")->group(
        $map, $initial, $reduce, array('finalize'=>$finalize));

相关内容

  • 没有找到相关文章

最新更新