您的位置:首页 > 数据库 > Mongodb

Mongodb新增的聚合方法及其Java客户端

2015-09-13 00:01 465 查看


Aggregation Framework Reference

http://cn.docs.mongodb.org/manual/reference/aggregation/#aggregation-framework-reference


Java Driver and Aggregation Framework

http://docs.mongodb.org/ecosystem/tutorial/use-aggregation-framework-with-java-driver/

Let’s use a simple example to demonstrate how the aggregation helper works. Suppose I am using MongoDB to store my employee’s travel expenses. I’ve created a collection named expenses,
which store individual expenses by employee and by department. Here’s a sample document:

{ "_id" : ObjectId("503d5024ff9038cdbfcc9da4"), 
"employee" : 61, 
"department" : "Sales", 
"amount" : 77, 
"type" : "airfare" }


I am auditing three departments: Sales, Engineering and Human Resources. I want to calculate each department’s average spend on airfare. I’d like to use the Aggregation Framework for the audit, so I think of the operation in terms of a pipeline:

Operation: Match documents where type = "airfare";
then pipe into

Operation: Pass only the department and the amount fields
through the pipeline; then pipe into

Operation: Average the expense amount, grouped by department.

I will use the aggregation operators $match, $project and $group to
perform each operation. Individual aggregation operations can be expressed as JSON objects, so I can think of my pipeline in JSON as:

First operation:

$match: { type: "airfare"}


Piped into:

$project: { department: 1, amount: 1 }


Piped into:

$group: { _id: "$department", average: { $avg: "$amount" } }

也就是说,运行以下命令:

db.expenses.aggregate({
$match:{type: "airfare"}
$project:{_id:0,department: 1, amount: 1}
$group:{_id: "$department", average: { $avg: "$amount" }}
})


Java 实现:

// create our pipeline operations, first with the $match 
DBObject match = new BasicDBObject("$match", new BasicDBObject("type","airfare") ); 

  // build the $projection operation 
DBObject fields = new BasicDBObject("department", 1); fields.put("amount",1); 
fields.put("_id", 0); 
DBObject project = new BasicDBObject("$project", fields ); 

// Now the $group operation 
DBObject groupFields = new BasicDBObject( "_id", "$department");groupFields.put("average", new BasicDBObject( "$avg", "$amount"));DBObject group = new BasicDBObject("$group", groupFields); 

// run aggregation 
AggregationOutput output = collection.aggregate( match, project, group );

Aggregations are executed as database commands in MongoDB. These commands embed the results of the aggregation task in an object that also contains additional information about how the command was executed. The return value of aggregate() is an instance of the AggregationOutput class, which provides assessors to this information.


public Iterable<DBObject> results() 
public CommandResult getCommandResult 
public DBObject getCommand()


Let’s take a look at the results of my audit:


System.out.println(output.getCommandResult());


{ "serverUsed" : "/127.0.0.1:27017" ,
 "result" : 
[ {"_id" : "Human Resources","average": 74.91735537190083},
 {"_id" : "Sales" , "average" : 72.30275229357798},
 {"_id" : "Engineering" , "average" : 74.1} ],
 "ok" : 1.0 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: