php mongodb получает поля уникальные значения - PullRequest
3 голосов
/ 28 ноября 2010

Я пытаюсь получить список уникальных значений из поля '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"]

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

Ответы [ 2 ]

11 голосов
/ 28 ноября 2010

В стандартной СУБД 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 }
            });

Здесь я прошу БД вернуть значения для ключа «тип» (отсюда и «истина»), и для каждого значения данная функция сокращения будет использоваться для агрегации найденных записей. Здесь я просто обновляю счетчик того, сколько раз появляется каждая запись. Если вы выполните этот запрос, вы получите что-то вроде этого:

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

]

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

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

1 голос
/ 28 ноября 2010

Вы можете использовать разные: http://www.mongodb.org/display/DOCS/Aggregation#Aggregation-Distinct

В php doc есть пример: http://php.net/manual/en/mongodb.command.php

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

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

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

...