2010-11-28 97 views
3

我試圖從我的mongodb集合的'type'字段中獲取唯一值的列表。mongodb php獲取字段的唯一值

{ 
     "_id" : ..., 
     "type" : "report", 
     "tasks" : ... 
} 
{ 
     "_id" : ..., 
     "type" : "research", 
     "tasks" : ... 
} 
{ 
     "_id" : ..., 
     "type" : "memo", 
     "tasks" : ... 
} 
{ 
     "_id" : ..., 
     "type" : "memo", 
     "tasks" : ... 
} 
{ 
     "_id" : ..., 
     "type" : "report", 
     "tasks" : ... 
} 
{ 
     "_id" : ..., 
     "type" : "report", 
     "tasks" : ... 
} 

我在尋找,通過頻率排序,獨特的類型,可在文檔的類型字段,那麼:下面的示例文件

["report", "memo", "research"] 

什麼是做到這一點的最好辦法?希望我能與蒙戈查詢和不下載整個集合做到這一點...

回答

11

在一個標準的SQL數據庫管理系統,這將用下面的查詢來完成:

SELECT type, count(*) as ct FROM table GROUP BY type ORDER BY ct; 

有關MongoDB,這將使用組函數來完成,雖然這是稍微複雜些:

db.collection.group(
      {key: { "type":true}, 
      reduce: function(obj,prev) { prev.count += 1; }, 
      initial: { count: 0 } 
      }); 

這裏我要求db返回關鍵字「type」的值(因此爲「true」),並且對於每個值,給定的reduce函數將用於彙總找到的記錄。這裏我只是更新每條記錄出現次數。如果你運行這個查詢,你會得到這樣的東西:

[ 
    { 
     "type" : "report", 
     "count" : 5 
    }, 
    { 
     "type" : "memo", 
     "count" : 15 
    } 
    { 
     "type" : "research", 
     "count" : 3 
    } 

] 

你會注意到這是不是訂購;即使是mongodb文檔也會說,訂購它的最簡單方法就是在客戶端進行。

相關文檔是here

+0

這個答案應該可以工作。只是一些額外的notes.This將是一個緩慢的查詢,除非`type`索引。即使有索引,你也必須「走」整個索引。如果這是一個對時間敏感的查詢,那麼應該將它設置爲map-reduce並按計劃運行。 – 2010-11-28 19:49:09

1

您可以使用不同的:http://www.mongodb.org/display/DOCS/Aggregation#Aggregation-Distinct

有一個在PHP文檔的例子:http://php.net/manual/en/mongodb.command.php

$types = $db->command(array("distinct" => "yourCollection", "key" => "type")); 

foreach ($types['values'] as $type) { 
    echo "$type\n"; 
} 

我不知道結果是否按頻率排序。

+0

仍然需要一種方法來獲取每個唯一值的頻率,以便按頻率對它們進行排序。我發現沒有辦法做到這一點使用獨特的,因此與團體更輕鬆的解決方案。 – Roadmaster 2010-11-28 19:05:32