Mongodb PHP Получение полей Уникальные значения
-
28-09-2019 - |
Вопрос
Я пытаюсь получить список уникальных значений из поля «Тип» из моей коллекции 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"]
Какой лучший способ сделать это? Надеюсь, я могу сделать это, запросив Mongo и не загружаю всю коллекцию ...
Решение
На стандартном SQL DBMS это будет сделано со следующим запросом:
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 }
});
Здесь я прошу БД возвращать значения для ключа «тип» (отсюда, «TRUE»), а для каждого значения данная функция уменьшения будет использоваться для объединения найденных записей. Здесь я просто обновляю количество того, сколько раз появляется каждая запись. Если вы запустите этот запрос, вы получите что-то подобное:
[
{
"type" : "report",
"count" : 5
},
{
"type" : "memo",
"count" : 15
}
{
"type" : "research",
"count" : 3
}
]
Вы заметите, что это не заказывается; Даже документы MongoDB говорят, что самый простой способ заказать это - сделать это клиенту.
Соответствующая документация здесь.
Другие советы
Вы можете использовать различные: http://www.mongodb.org/display/docs/aggregate_aggretation-distict.
Существует пример в 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";
}
Я не знаю, если результаты упорядочены по частоте.