0

DISTINCTカウントを使用してPHPでグループ関数を実行する良い方法はありますか?状況は次のとおりです。アプリへの一意のログインを確認したい。クエリを実行している現在のコレクションのドキュメントは次のようになります。

Array
(
    [_id] => MongoId Object
        (
            [$id] => 50f6da87686ba9f449000003
        )

    [userId] => 50f6bd0f686ba91a4000000f
    [action] => login
    [time] => 1358355079

私がやりたいのは、日付ごとにグループステートメントを介してUNIQUEユーザー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メモリ内で実行しています...しかし、私が本当にやりたいこと(そしてネット上で良い答えを見つけることができないこと)は、groupbyで明確にカウントされます。を使用できる他の例をいくつか見てき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)として)groupbyで保持する方法を見つけたいと考えています。

4

1 に答える 1

0

次のようなことができるはずです。

...
$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));
于 2013-01-28T06:39:54.747 に答える