【问题标题】:mongodb php getting fields unique valuesmongodb php获取字段唯一值
【发布时间】:2011-05-16 22:08:43
【问题描述】:

我正在尝试从我的 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 查询而不是下载整个集合来做到这一点......

【问题讨论】:

    标签: php mongodb mongodb-php querying


    【解决方案1】:

    您可以使用 distinct :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";
    }
    

    不知道结果是不是按频率排序的。

    【讨论】:

    • 仍然需要一种方法来获取每个唯一值的频率,以便按频率对它们进行排序。我发现没有办法使用 distinct 来做到这一点,因此使用 group 的解决方案稍微复杂一些。
    【解决方案2】:

    在标准 SQL DBMS 上,这将通过以下查询完成:

    SELECT type, count(*) as ct FROM table GROUP BY type ORDER BY ct;
    

    在 mongodb 上,这将使用 group 函数完成,尽管它稍微复杂一些:

    db.collection.group(
               {key: { "type":true},
                reduce: function(obj,prev) { prev.count += 1; },
                initial: { count: 0 }
                });
    

    这里我要求数据库返回键“type”的值(因此是“true”),并且对于每个值,给定的 reduce 函数将用于聚合找到的记录。在这里,我只是更新每条记录出现的次数。如果你运行这个查询,你会得到这样的结果:

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

    您会注意到这不是有序的;甚至 mongodb 文档都说订购它的最简单方法是在客户端进行。

    相关文档为here

    【讨论】:

    • 这个答案应该有效。只是一些额外的注释。除非type 被索引,否则这将是一个缓慢的查询。即使使用索引,您基本上也必须“遍历”整个索引。如果这是对时间敏感的查询,则应将其设置为 map-reduce 并按计划运行。
    • 盖茨副总裁完全正确,请注意性能问题。一种可能的解决方法是为每个可能的“类型”值保留一个计数缓存(假设您将它们放在另一个集合中),并在每次添加或删除记录时更新此计数器。意味着在添加/删除记录时对性能的影响很小,但如果您需要频繁访问您的类型和计数,从长远来看,这将节省时间。
    • 忘了说谢谢,谢谢,这正是我想要的。 +1
    猜你喜欢
    • 2018-01-18
    • 2020-05-06
    • 2012-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 1970-01-01
    相关资源
    最近更新 更多