MongoDB高级用法
1.聚合 aggregate
适用场景:统计数据
方法:db.collection.aggrate([array]);
操作符:
$project:包含、排除、重命名以及显示字段
$match:查询
$limit:限制结果数量
$skip:跳过结果数量
$sort:排序
$group:分组
$unwind:分割嵌入数组到自己的顶层文件
实例:
java封装类:
protected AggregationOutput aggregate(DB db,String name,DBObject firstOp, DBObject ... additionalOps) throws Exception
{
return db.getCollection(name).aggregate(firstOp, additionalOps);
}
示例数据:
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}
示例一:$project 获取部分数据,类似select arg1,arg2 from table
DBobject projectQuery=new BasicDBObject("$project",new BasicDBObject("_id",1)
.append("name",1));
List<DBObject> dboList = (List<DBObject>)aggregate(db, user,projectQuery);
实例二:$match 匹配查询条件
DBobject matchQuery=new BasicDBObject("$match",new BasicDBObject("name","a"));
List<DBObject> dboList = (List<DBObject>)aggregate(db, user,matchQuery);
实例三:$group 分组
DBobject groupQuery=new BasicDBObject("$group",new BasicDBObject("_id","$name").append("count",new BasicDBObject("$sum",1)).append("total",new BasicDBObject("$sum","$num")));
List<DBObject> dboList = (List<DBObject>)aggregate(db, user,matchQuery);
二、group
方法:
public DBObject group(DBObject key,
DBObject cond,
DBObject initial,
String reduce,
String finalize)
throws MongoException
参数:
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.
示例:
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.索引
好处:加速查询
创建索引:db.test.ensureIndex({"username":1})
查看是否建立索引:db.test.getIndexes()
删除索引:db.test.dropIndex({"username":1})
查看查询全部信息:db.test.find().explain()
4.其他查询
$where