我有以下代码:
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位。
任何人都可以帮忙吗?我猜有一些配置问题。
答案 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中):