mongodb php получает уникальные значения полей

Я пытаюсь получить список уникальных значений из поля type из моей коллекции mongodb. Примеры документов ниже:

{ "_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"] 

Каков наилучший способ сделать это? Надеюсь, я смогу сделать это, запросив манго и не загрузив всю коллекцию …

В стандартной СУБД 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»), и для каждого значения данная функция сокращения будет использоваться для агрегирования найденных записей. Здесь я просто обновляю счет того, сколько раз появляется каждая запись. Если вы запустите этот запрос, вы получите что-то вроде этого:

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

Вы заметите, что это не заказано; даже mongodb docs говорят, что самый простой способ заказать это – сделать это на стороне клиента.

Соответствующая документация находится здесь .

Вы можете использовать различные: 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"; } 

Я не знаю, упорядочены ли результаты по частоте.