Я пытаюсь получить список уникальных значений из поля 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"; }
Я не знаю, упорядочены ли результаты по частоте.