【问题标题】:MongoDB amount of entriesMongoDB 条目数量
【发布时间】:2012-05-22 23:25:56
【问题描述】:

如何获取仅包含特定键中唯一数据的条目数量(在集合中)?

例如:

{
   "_id": ObjectId("4f9d996eba6a7aa62b0005ed"),
   "tag": "web" 
}
{
   "_id": ObjectId("4f9d996eba6a7aa62b0006ed"),
   "tag": "net" 
}
{
   "_id": ObjectId("4f9d996eba6a7aa62b0007ed"),
   "tag": "web" 
}
{
   "_id": ObjectId("4f9d996eba6a7aa62b0008ed"),
   "tag": "page" 
}

具有唯一键“tag”的条目数,返回3。

ps:如果可能的话,如何获取所有找到的 key: "tag" 唯一值的列表?

【问题讨论】:

    标签: mongodb querying


    【解决方案1】:

    要获得unique 值列表,您需要DISTINCTGROUP BY。 MongoDB 支持这两种范式:

    要获取您将运行的所有不同 tag 值的列表:

    db.mycollection.distinct('tag');
    

    db.runCommand({ distinct: 'mycollection', key: 'tag' })
    

    您只需查看结果的length 即可获得计数:

    db.mycollection.distinct('tag').length
    

    注意文档中的distinct 命令:Note: the distinct command results are returned as a single BSON object. If the results could be large (> max document size – 4/16MB ), use map/reduce instead

    【讨论】:

    • 谢谢!我只有 14 分,但你的回答值得 +1。
    • 仅供参考:此解决方案将有效,但仅适用于 2.2+ 版本。截至 2012 年 5 月 15 日,2.2 尚未发布。目前要使用它,您必须获取 2.1 开发版本。
    • @SeanReilly db.version() 在我的本地实例上返回 2.0.5,我在提交之前检查了代码。有效。 if 的哪一部分不应该起作用?
    • 好点。现在不同的作品。更大的聚合框架功能是 2.2+ 中的功能。我很抱歉。
    【解决方案2】:

    您可以使用Map/Reduct 对条目进行分组。

    我创建了名为“内容”的内容,并在其中插入了 4 个数据(您在上面列出的)。然后通过使用下面的 map/reduce 代码,您可以按它们的标签对它们进行分组。最终结果写入内容名称“result”。

    var map = function() {
        emit(this.tag, 1);
    };
    
    var reduce = function(key,values){
        var result = 0;
        for(v in values){
            result += values[v];
        }
        return result;
    };
    
    res = db.content.mapReduce(map,reduce,{out:"result"}});
    

    结果如下。

    { "_id" : "net", "value" : 1 }
    { "_id" : "page", "value" : 1 }
    { "_id" : "web", "value" : 2 }
    

    【讨论】:

    • 谢谢!我只有 14 分,但你的回答值得 +1。
    猜你喜欢
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 2012-08-24
    • 1970-01-01
    • 1970-01-01
    • 2015-10-10
    • 2014-05-15
    相关资源
    最近更新 更多