我正在尝试从我的mongodb集合中的'type'字段中获取唯一值的列表。以下示例文档:
{
"_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而不是下载整个集合来实现这一目标......
答案 0 :(得分:11)
在标准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 }
});
这里我要求db返回键“type”的值(因此为“true”),对于每个值,给定的reduce函数将用于聚合找到的记录。在这里,我只是更新每条记录出现次数的计数。如果您运行此查询,您将得到以下内容:
[
{
"type" : "report",
"count" : 5
},
{
"type" : "memo",
"count" : 15
}
{
"type" : "research",
"count" : 3
}
]
你会发现这不是订购的;即使是mongodb文档也说最简单的订购方式是在客户端进行。
相关文档为here。
答案 1 :(得分:1)
您可以使用distinct: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";
}
我不知道结果是按频率排序的。