4

我有一個使用了幾個組的MongoDB的聚合操作:如何使用MongoDB聚合框架來統計滿足特定條件的組的數量?

{ $group: { "_id": { "vid": "$visitor_id", "pid":"$project.id" } } } 
{ $group: { "_id": "$_id.vid", "count": { $sum: 1} } } 

返回以下數據:

{ 
    "results": [ 
    { 
     "_id": "user1", 
     "count": 1 
    }, 
    { 
     "_id": "user2", 
     "count": 2 
    }, 
    { 
     "_id": "user3", 
     "count": 1 
    } 
    ] 
} 

我怎麼能去超過1返回用戶總數項目(count字段)。在這種情況下,它會是這樣的:

{ 
    total: 1 
} 

因爲只有user2有超過1個項目(count> 1)。

我嘗試添加下面的一組操作不得要領:

{ 
    $group: { 
    "_id": null, 
    count: { 
     $sum: {$cond: [{$gt: ['$_id.count', 1]}, 1, 0]} 
    } 
    } 
} 

任何想法?

+1

難道你不能像**'$ match' **運算符那樣只是有一個最終的聚合管道步驟來過濾計數,即'{「$ match」:{「count」:{「$ gt」 :1}}}'? – chridam

回答

3

你可以達到你想要的結果那麼簡單,添加以下三個聚集階段到您的管道:

{$match: {count: {$gt: 1}}} 
{$group: {_id: null, total: {$sum: 1}}} 
{$project: {_id: 0, total: 1}} 
  1. 作爲chridam mentined你可以有一個$match階段來過濾所有具有更多的用戶比1個項目。
  2. 然後用另一個$group階段來計算這些用戶的總數。
  3. 第三步只是化妝品,葉子只有total字段。
+1

絕對正確。我不知道爲什麼我沒有想到這一點。非常感謝你和@chridam的幫助! – ashe540

+0

這是因爲'$ group'舞臺是一件很酷的事情,你想把它放在它:)很高興它的工作! – bagrat