MongoDB高级用法
1.聚合aggravate
适用场景:统计数据
方法:db.collection.aggregate([array]);
操作符介绍:
$project:包含、排除、重命名和显示字段
$match:查询,需要同find()一样的参数
$limit:限制结果数量
$skip:忽略结果的数量
$sort:按照给定的字段排序结果
$group:按照给定表达式组合结果
$unwind:分割嵌入数组到自己顶层文件
举例:
1 {_id:1,name:"a",status:1,num:1}
2 {_id:2,name:"a",status:0,num:2}
3 {_id:3,name:"b",status:1,num:3}
4 {_id:4,name:"c",status:1,num:4}
5 {_id:5,name:"d",status:1,num:5}
以下是示例:
应用一:统计name的数量和总数;
db.collection.aggregate([
{$group:{_id:"$name",count:{$sum:1},total:{$sum:"$num"}}
]);
应用二:统计status=1的name的数量;
db.collection.aggregate([
{$match:{status:1}},
{$group:{_id:"$name",count:{$sum:1}}}
]);
应用三:统计name的数量,并且数量为小于2的;
db.collection.aggregate([
{$group:{_id:"$name",count:{$sum:1}},
{$match:{count:{$lt:2}}}
]);
应用四:统计stauts=1的name的数量,并且数量为1的;
db.collection.aggregate([
{$match:{status:1}},
{$group:{_id:"$name",count:{$sum:1}}},
{$match:{count:1}}
]);
多列group,根据name和status进行多列
db.collection.aggregate([
{$group:{_id:{name:"$name",st:"$status"},count:{$sum:1}}}
]);
$project该操作符很简单,
db.collection.aggregate([
{$project:{name:1,status:1}}
]);
结果是,只有_id,name,status三个字段的表数据,相当于sql表达式 select _id,name,status from collection
2 group
public DBObject group(DBObject key, DBObject cond, DBObject initial, String reduce, String finalize) throws MongoException
- Applies a group operation
-
-
Parameters:
-
key
- - { a : true } -
cond
- - optional condition on query -
reduce
- javascript reduce function -
initial
- initial value for first match on a key -
finalize
- An optional function that can operate on the result(s) of the reduce function.
Returns:
Throws:
-
MongoException
See Also:
- http://www.mongodb.org/display/DOCS/Aggregation
-
-
- 案例实现:
-
-
- final List<String> targetTerms = Arrays.asList("dogs", "cats");
- final Datastore ds = ….
- final DBCollection coll = ds.getCollection(Example.class);
- BasicDBObject key = new BasicDBObject("_id", true);
- BasicDBObject cond = new BasicDBObject();
- cond.append("indices", new BasicDBObject("$in", targetTerms));
- BasicDBObject initial = new BasicDBObject();
- initial.append("score", 0);
- initial.append("targetTerms", targetTerms);
- String reduce = "function (obj, prev) { " +
- " for (i in prev.targetTerms) {" +
- " targetTerm = prev.targetTerms[i];"+
- " for (j in obj.indices) {" +
- " var index = obj.indices[j];"+
- " if (targetTerm === index) prev.score++;" +
- " }" +
- " }" +
- "}";
- String fn = null;
- final BasicDBList group = (BasicDBList) coll.group(key, cond, initial, reduce, fn);
-
3 索引 ensureIndex