2017-03-27 72 views
1

我一直在一個項目,現在需要使用MongoDB計數功能(MySQL等值計數功能)。我現在的代碼是MongoDB與查詢計數

$filter = ["username" => array('$ne' => null, '$ne' => '')]; 

$options = ["projection" => ['username' => true]]; 

$query = new MongoDB\Driver\Query($filter, $options); 

$cursor = $mongo->executeQuery('mongodbLog.logs', $query); 

我想在$ filter數組中添加計數功能,但是我無法使其正常工作。

我想讓我的MongoDB查詢獲得與此MySQL查詢相同的結果:「SELECT username,count(*) FROM mysqlLog WHERE username <> '' GROUP BY username」。 到目前爲止我所管理的所有東西都是where子句的等價物,現在我被卡住了。

+2

你覺得呢'陣列( '$ NE'=> NULL, '$ NE'=> '')'的回報? – styvane

+0

這將返回列用戶名不爲空或空字符串的所有字段。 – heatonhampus

+1

不是我所問的。 http://ideone.com/vBkUgj – styvane

回答

0

您可以嘗試下面的聚合。

聚合平臺 - $match - $group - $project

$pipeline = 
     [ 
      [ 
       '$match' => 
        [ 
        '$and' => 
         [ 
          ['username' => ['$ne' => null]], 
          ['username' => ['$ne' => '']], 
         ], 
        ], 
      ], 
      [ 
       '$group' => 
        [ 
         '_id' => '$username', 
         'count' => ['$sum' => 1], 
        ], 
      ], 
      [ 
       '$project' => 
        [ 
         '_id' => 0, 
         'username' => 1, 
         'count' => 1, 
        ], 
      ], 
     ]; 

    $command = new \MongoDB\Driver\Command([ 
     'aggregate' => 'logs', 
     'pipeline' => $pipeline 
     ]); 

    $cursor = $mongo->executeCommand('mongodbLog', $command); 
+0

嘿,這似乎是訣竅!最初沒有給我用戶名,但是我刪除了'_id'=> 0,因爲我注意到用戶名被放在那裏。謝謝你的幫助!任何想法如何包括在給定的時間戳內搜索?我已經使用過代碼「timestamp」=> array('$ gte'=> intval($ startDate)),但是不知道把它放在這個結構中的哪個位置 編輯:我把「['timestamp'=> '$ gte'=> intval($ startDate)]],「在用戶名條件之後。非常感謝您的幫助。 – heatonhampus