2014-09-04 141 views
0

我有下面的代码,:蒙戈DB汇总查询返回批量

CommandResult cr = db.doEval("db." + collectionName + ".aggregate(" 
       + query + ")"); 

命令结果分批,我需要在单个值获得给出。

Batch Result:{ "serverUsed" : "/servername" , "retval" : { **"_firstBatch**" : [ { "visitor_localdate" : 1367260200} , { "visitor_localdate" 

预期结果:

{ "serverUsed" : "/servername" , "retval" : { "**result**" : [ { "visitor_localdate" : 1367260200} , { "visitor_localdate" 

蒙戈DB我们使用的是2.6.4 64位。

任何人都可以帮忙吗?我猜测有一些配置问题。

回答

1

你这样做是错的。你不需要像这样跳过箍环来获得一个动态的集合名称。只要使用此语法来代替:

var collectionName = "collection"; 

var cursor = db[collectionName].aggregate(pipeline) 

哪里pipeline也只是流水线级文件的阵列,即:

var pipeline = [{ "$match": { } }, { "$group": { "_id": "$field" } }]; 

在任何情况下的.aggregate()方法返回一个指针,你可以遍历的结果标准方法:

while (cursor.hasNext()) { 
    var doc = cursor.next(); 
    // do something with doc 
} 

但你实际上是这样做在Java中,而不是JavaScript,因此从基本驱动程序与对象的连接db你只是这样做:

DBObject match = new BasicDBObject("$match", new BasicDBObject()); 
    DBObject group = new BasicDBObject("$group", new BasicDBObject()); 

    List pipeline = new ArrayList(); 
    pipeline.add(match); 
    pipeline.add(group); 
    AggregationOutput output = db.getCollection("collectionName").aggregate(pipeline); 

管道基本上是的,你构造一个代表所要求的操作BSON文件DBOBJECT信息的列表界面。

在这里结果是AggregationOutput,但光标一样的结果获得通过追加供给AggregationOptions作为附加选项pipeline

+0

嗨..尼尔,感谢信息,我们正在尝试在Java中使用Achevie。综合功能剂量直接以pipline作为参数。 – 2014-09-04 06:58:52

+0

@BlueWhale当然可以。让我启动一些代码并重新标记您的问题。 – 2014-09-04 07:01:40

+0

@BlueWhale你走了,都很简单。您不需要将代码作为JavaScript发送到服务器来执行此操作。 – 2014-09-04 07:18:55

0

从尼尔·伦恩答案是没有错的,但我想补充一点,结果你期待是早于v2.6的mongodb版本的结果。

V2.6之前,聚集函数返回刚刚一个文档含结果字段,其中包含的由管道返回的文档的阵列,和一个确定的字段,其中包含的值为1,表示成功。 但是,从mongodb v2.6开始,聚合函数返回一个光标(如果没有使用$ out选项)。

examples in mongodb v2.6 documentation和比较它是如何工作V2.6之前(在v2.4即):