java - 字段出现的文档数量 - MongoDB

标签 java mongodb query-optimization

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

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

这意味着在我的 Collection 中有 _id 的文档字段只是一个 ObjectId , nameStringObjectdateOfBirth可以是 StringDate
现在,我的目标是查找出现字段的文档数量。所以我写了这个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存在于我 Collection 的 500 份文档中,name 340 和 dateOfBirth 100 以内。

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

最佳答案

您可以执行简单的映射缩减来计算集合中的所有顶级字段:

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

关于java - 字段出现的文档数量 - MongoDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35628380/

相关文章:

javascript - 如何在 Meteor 中动态更新/设置集合的子属性?

mysql - 如何使用子查询、WHERE IN 和 varchar 比较字段优化查询?

java - 如何自动化循环函数工作 (x) 次/使其递归工作

java - 如何将 Firebase 电话身份验证与电子邮件/密码身份验证相关联?

Java CDI : How to change producers at runtime using qualifiers with multiple values?

spring - 如何配置 Spring Repository 以使用 xml bean 中定义的 mongoTemplate?

java - 在 android 中填充列表时找不到资源

java - 限制 Reactor Flux 读取 Mongodb 集合的吞吐量

postgresql - 如何提高 postgres 查询的选择速度?

c# - LINQ 组合查询