Mongodb聚合查询以批次形式返回

时间:2014-09-04 06:41:21

标签: java mongodb mongodb-query aggregation-framework

我有以下代码:

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"

我们使用的Mongo DB是2.6.4,64位。

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

3 个答案:

答案 0 :(得分: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);

管道基本上是DBObject信息的列表接口,您可以在其中构建表示所需操作的BSON文档。

此处的结果为AggregationOutput,但通过另外提供AggregationOptions作为pipeline

的附加选项,可获得类似游标的结果

答案 1 :(得分:0)

mongodb 2.6中添加了一些与批处理相关的内容,详情请见http://docs.mongodb.org/manual/reference/method/db.collection.aggregate/#example-aggregate-method-initial-batch-size

从链接

db.orders.aggregate(
[
      { $match: { status: "A" } },
      { $group: { _id: "$cust_id", total: { $sum: "$amount" } } },
      { $sort: { total: -1 } },
      { $limit: 2 }
],
      {
        cursor: { batchSize: 0 }
      }
)

您可能在聚合查询中有一个游标批处理

答案 2 :(得分:0)

Neil Lunn的回答并没有错,但我想补充一点,你期望的结果是早于v2.6的mongodb版本的结果。

在v2.6之前,聚合函数只返回包含结果字段的一个文档,其中包含管道返回的文档数组,以及一个保存值为1的ok字段,表示成功。 但是,从mongodb v2.6开始,聚合函数返回光标(如果未使用$ out选项)。

请参阅examples in mongodb v2.6 documentation并比较它在v2.6之前的工作方式(即在v2.4中):