使用MongoDB java驱动程序通过查询获取每个文档中的字段数

时间:2016-02-06 13:28:28

标签: mongodb mongodb-query mongodb-java

是否可以使用来自MongoDB java驱动程序的查询获取文档中的字段数

示例:

 Document1 :{_id:1,"type1": 10 "type2":30,"ABC":123,"DEF":345}
 Document2 :{_id:2,"type2":30,"ABC":123,"DEF":345}

注意:在第二个文件" type1"关键不存在。

当我投影时

是否可以仅投影" type1"和" type2"并获取该文档中存在的字段数。

使用当前代码我获取所有文档并单独搜索是否存在我正在查找的键存在于整个游标中: 剪辑的代码如下:

MongoClient mcl=new MongoClient();
MongoDatabase mdb=mcl.getDatabase("test");
MongoCollection mcol=mdb.getCollection("testcol");
FindIterable<Document> findIterable = mcol.find();
MongoCursor<Document> cursor = findIterable.iterator();
//Here am having 120 types checking if each type is present..
while(cursor.hasNext())
{

Document doc=cursor.next();
int numberOfTypes=0;
for(int i=1;i<=120;i++)
{
if(doc.containsKey("type"+i))
{
numberOfTypes++;
}
}
System.out.println("*********************************************");
System.out.println("_id"+doc.get("_id"));
    System.out.println("Number of Types in this document are "+numberOfTypes);
System.out.println("*********************************************");
    }

}

如果记录少于它不会过载到应用程序,则此代码正常工作。假设每个Document包含120种类型有5000000,应用程序崩溃,因为每次迭代都会涉及更多垃圾收集正在创建一个文档。还有其他方法可以实现上述功能。

1 个答案:

答案 0 :(得分:0)

从我的java代码中读到

  

仅限项目&#34; type1&#34;和&#34; type2&#34;并获取该文档中存在的字段数。

作为

project only type[1..120] fields and number of such fields in the document

有了这个假设,你可以map-reduce如下:

db.testcol.mapReduce(
function(){
    value = {count:0};
    for (i = 1; i <= 120; i++) {
        key = "type" + i
        if (this.hasOwnProperty(key)) {
            value[key] = this[key];
            value.count++
       }
    }
    if (value.count > 0) {
        emit(this._id, value);
    }
},
function(){
    //nothing to reduce
},
{
    out:{inline:true}
});
当结果符合16Mb limit时,

out:{inline:true}适用于小型数据集。对于较大的响应,您需要output到集合,您可以像往常一样查询和迭代。