基本概念
mongo db是非关系型数据库的一种,性能高,容易部署,单表可达千万级别,业界流行一句话,百万级别用Mysql,千万级别用mongo;mongo介于关系型数据库和大数据库(如hadoop)之间,它既有关系行数据据库良好的查询功能,又有大数据库海量的存储。它是基于json的一种扩展数据结构BSON作为存储结构。
BSON:bson对json的一大改进就是,它会将json的每一个元素的长度存在元素的头部,这样你只需要读取到元素长度就能直接seek到指定的点上进行读取。bson在json基础上增加了“byte array”数据类型,使得二进制的存储不再需要先base64转换后再存成json,减少了计算开销。json是按照字符串存储,bson是按结构存储的(像数组 )。
mongo是一种文档型存储,集合中每条记录代表了一个文档,每一个文档都有唯一的一个"_Id"相当于Mysql中的主键;多个文档的的分组构成一个collection;mongo还只是javascript脚本语言,使得mongo的查询非常丰富灵活。
本文基于mongo3.4.6版本测试通过
1.查询多个对象
查询中国大于17岁以上的人
import static org.springframework.data.mongodb.core.query.Criteria.where;
import static org.springframework.data.mongodb.core.query.Query.query;
Query query= query(where("area").is("china").and("age").gte(17));
List<Person> ret= mongoOperations.find(query,Person.class);
或者List<Person> ret= mongoOperations.find(query,Person .class,"collectionName")
2.查询单个对象
查询身份证为612650199201121156的人
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import static org.springframework.data.mongodb.core.query.Criteria.where;
Criteria criteria= where("idCard").is("612650199201121156");
Query query = new Query(criteria);
Person p= mongoOperations.findOne(query,Person.class);
3.分页排序查询
//import 省略
int offset=0;
int limit=20;
Criteria criteria= where("area").is("china").and("age").gte(17);
Query query = new Query(criteria);
query.with(new Sort(new Sort.Order(Sort.Direction.ASC, "area"),new Sort.Order(Sort.Direction.ASC, "age")));
query.skip(offset).limit(limit);
List<Person> ret= mongoOperations.find(query,Person.class)
4.统计记录数count
//import 省略
Criteria cri = Criteria.where("area").is("china").and("age").gte(17);
Query query = Query.query(cri);
long count = mongoOperations.count(query, "collectionName");
或者long count = mongoOperations.count(query, Person.class);
5.数据聚合分组
求平均:
求中国人的平均年龄
Criteria criteriaDefinition = Criteria.where("age").gt(0).and("area").is("china");
Aggregation aggregation = Aggregation.newAggregation(Aggregation.match(criteriaDefinition), Aggregation.group("userId").avg("age").as("avgAge"));
AggregationResults<DBObject> aggregate = mongoOperations.aggregate(aggregation, collectionName, DBObject.class);
List<DBObject> mappedResults = aggregate.getMappedResults();
double avgAge= (double)mappedResults.get("avgAge");
求sum:Aggregation.group("userId").sum("age");
求count:Aggregation.group("area").count();
mongo在spring boot中的配置
在application.properties中配置:
mongodb.uri= mongodb://message:123456@127.0.0.1:27017/message
@Configuration
public class MongoConfig {
@Value("${mongodb.uri}")
private String mongoURI;
@Bean
public MongoDbFactory mongoDbFactory() throws UnknownHostException {
MongoClientURI mongoClientURI= new MongoClientURI(mongoURI);
return new SimpleMongoDbFactory(mongoClientURI);
}
}
windows下mongo数据导入脚本:
mongorestore -h 127.0.0.1:27017 -d db1 D:\server\mongodb\hunan_dbdata\mongodb_201805031610\201805031610\mongodump\db2