出现字段的文档数 - MongoDB

Posted

技术标签:

【中文标题】出现字段的文档数 - MongoDB【英文标题】:Number of documents where a field appears - MongoDB 【发布时间】:2016-02-25 13:15:16 【问题描述】:

我的 java 应用程序使用 map-reduce 从 MongoDB 集合中检索一对字符串 <field's name, types>。 例如我有:

<_id,ObjectId>
<name, String,Object>
<dateOfBirth, String,Date>

这意味着在我的集合中,_id 字段只是 ObjectIdnameStringObjectdateOfBirth 可以同时是 String 和 @987654330 的文档@。 现在,我的目标是找出某个字段出现的文档数量。所以我写了这个java方法

public int countFields(String s) 

        DBObject query = new BasicDBObject(s,new BasicDBObject("$exists",1));

        int n = coll.find(query).count();
        return n;

    

这个方法工作正常:在输入中给定一个代表字段名称的字符串,它会找到该字符串出现的文档数。 因此,对于每个字段,我都有这样的内容:

<_id, 500>
<name,340>
<dateOfBirth, 100>

这意味着_id 出现在我收藏的 500 个文档中,name 出现在 340 中,dateOfBirth 出现在 100 中。

假设我必须对集合的所有字段运行此方法:效率不高!例如,我的集合中有大约 30k 个文档,我为每个字段 s 运行 countFields(s) 方法,它需要大约 3 秒检索出现字段的文档数。 我该怎么做才能在此查询上获得更好的性能?

【问题讨论】:

【参考方案1】:

您可以做一个简单的 map-reduce 来计算集合中的所有***字段:

db.coll.mapReduce(
    function()
        for (var field in this)  
            emit(field, 1); 
                    
    ,
    function(field, times) 
        return Array.sum(times);
    
)

【讨论】:

好的,你认为 map reduce 在复杂性方面更好吗? 我没有配置文件,但我会这么认为。此外,如果您不需要所有字段,可以将其限制为特定列表。 不幸的是,我需要所有字段,但我要测试 map-redue。感谢您的建议。 它只适用于***字段。如果我创建一个使用递归来计算***字段的 map-reduce,你认为我可以提高性能吗? 我确信计算嵌套字段会比计算***字段慢。除此之外,您还需要为递归调用定义一个函数,定义如何表示嵌套字段的语法,并实现处理数组的逻辑。

以上是关于出现字段的文档数 - MongoDB的主要内容,如果未能解决你的问题,请参考以下文章

MongoDBMongodb——GridFS存储

mongodbmongodb提升

MongoDBMongoDb数据结构

短时间上手MongoDB

MongoDB面试题

MongoDB面试题