2010-11-28 5 views
3

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

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

] 

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

Соответствующая документация: here.

+0

Этот ответ должен работать. Только некоторые дополнительные примечания. Это будет медленный запрос, если индексируется `type`. Даже с индексом вам по существу придется «ходить» по всему индексу. Если это временный запрос, то это должно быть настроено как сокращение карты и выполняться по расписанию. – 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"; 
} 

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

+0

По-прежнему нужен способ получения частот для каждого уникального значения для сортировки по частоте. Я не нашел возможности сделать это, используя разные, а значит, несколько более активное решение с группой. – Roadmaster 2010-11-28 19:05:32