MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
org.springframework.data
spring-data-mongodb
2.1.1.RELEASE
org.mongodb
mongo-java-driver
3.8.2
在resources目录下新建mongodb-config.properties 文件
#mongoDB连接配置
mongo.host=###
mongo.port=27017
mongo.username=dev
mongo.password=dev
mongo.database=dev
#一个线程变为可用的最大阻塞数
mongo.connectionsPerHost=8
#线程队列数,它以上面connectionsPerHost值相乘的结果就是线程队列最大值
mongo.maxWaitThread=4
#连接超时时间(毫秒)
mongo.connectTimeout=10000
#最大等待时间
mongo.maxWaitTime=1500
#自动重连
mongo.autoConnectRetry=true
#scoket保持活动
mongo.socketKeepAlive= true
#scoket超时时间
mongo.socketTimeout=1500
#读写分离
mongo.slaveOk=true
#线程堆数
mongo.threadsAllowedToBlockForConnectionMultiplier=4
在resources目录下新建mongodb-config.xml文件
这里遇到一个问题,因为之前项目中本来就用了mysql,然后有一个 jdbc.properties文件已经导入到项目中,因此我一开始也是向导入 jdbc.properties一样使用,结果报错:
“Could not resolve placeholder”
原因是Spring在管理配置文件的时候冲突了,因此需要在导入的配置项目中加上:ignore-unresolvable=“true” 或者 全写到一个resoure.properties文件中,全引用这个文件
//实体
public class UserMongodb {
private String id;
private String mobile;
private String name;
private String avatar;
}
Service
public interface UserMongoService {
void add(UserMongodb user);
void insert(List user);
UserMongodb get(String name);
UserMongodb update(UserMongodb user);
void delete(String id);
void groups(String id);
}
Service实现
@Service
public class UserMongoServiceImpl implements UserMongoService {
@Autowired
private MongoTemplate mongoTemplate;
@Override
public void add(UserMongodb user) {
mongoTemplate.save(user);
}
@Override
public UserMongodb get(String name) {
Query sql = new Query(Criteria.where("name").is(name));
return mongoTemplate.findOne(sql,UserMongodb.class);
}
@Override
public void insert(List user) {
mongoTemplate.insert(user,UserMongodb.class);
}
@Override
public UserMongodb update(UserMongodb userMongodb) {
Query query = new Query(Criteria.where("name").is(userMongodb.getName()));
Update update = new Update();
//Update update = Update.update("avatar",userMongodb.getAvatar());
update.set("avatar",userMongodb.getAvatar());
update.set("mobile",userMongodb.getMobile());
//更新字段 只更新一个
mongoTemplate.updateFirst(query,update,UserMongodb.class);
return userMongodb;
}
@Override
public void delete(String id) {
Query query = new Query(new Criteria("_id").is(id));
try {
// mongoTemplate.findAllAndRemove(query,UserMongodb.class);
mongoTemplate.remove(query,UserMongodb.class);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 统计每天的数量 按创建时间分组
* @param id
*/
@Override
public void groups(String id) {
Criteria criteria = new Criteria();
TypedAggregation agg = Aggregation.newAggregation(UserMongodb.class,Aggregation.match(criteria),
project().andExpression("{$dateToString:{format:'%Y-%m-%d',date:{$add:{'$createTime',8*60*60000}}}}").as("createTi"),
group("createTi").count().as("count")
,sort(Sort.Direction.DESC, "createTi"));
AggregationResults result1s = mongoTemplate.aggregate( agg, BasicDBObject.class);
result1s.getMappedResults();
return;
}
}
接口
@RestController
public class UserMongoController {
@Autowired
UserMongoService userMongoService;
@RequestMapping(value = "/get",method = RequestMethod.GET)
public Object get(String name){
UserMongodb user = userMongoService.get(name);
return user;
}
@RequestMapping(value = "/add",method = RequestMethod.GET)
public Object add(){
UserMongodb user = new UserMongodb();
user.setName("123");
user.setAvatar("http");
userMongoService.add(user);
return user;
}
@RequestMapping(value = "/update",method = RequestMethod.GET)
public Object update(){
UserMongodb user = new UserMongodb();
user.setName("123");
user.setAvatar("http1");
userMongoService.update(user);
return user;
}
@RequestMapping(value = "/delete",method = RequestMethod.GET)
public void delete(String id){
userMongoService.delete(id);
}
}
整体完成,现在觉得mongodb是最像sql的nosql
1.在选包版本的时候发现和spring版本的冲突,核心包里也有spring相关所以防止冲突,注意版本或者排除核心包spring的版本
org.springframework.data
spring-data-mongodb
2.1.1.RELEASE
org.springframework
spring-core
org.springframework
spring-beans
org.springframework
spring-context
org.springframework
spring-tx
org.springframework
spring-expression
2.调用接口时报错
是因为当时设置了访问需要账号密码没有在mongo:mongo-client中加上
credentials="${mongo.username}:${mongo.password}@${mongo.database}
连接用户密码库信息
3.创建实体时id须为String类型,为Long时报错,因为当时保存的时候没有setId所以mongodb用的自带生成的id 5c1aff49df18a54dbd4654eb ObjectId类型的,所以取得时候报错,如果想要别的类型的id,需要保存时setId
4.按时间分组统计时发现数据对不上,原来mongodb中format函数时间格式转换时,时间早8个小时其中一个时间是2018-12-21 05-00-00 ,这个算到了20号的数据,因为我们这里是东八区,mongodb 是格林尼治时间相差8个小时
db.userMongodb.aggregate([{$group : {_id : {$dateToString:{format:"%Y-%m-%d",date:"$createTime"}}, num : {$sum : 1}}}]);
db.userMongodb.aggregate([{$group : {_id : {$dateToString:{format:"%Y-%m-%d",date:{$add:['$createTime',8*60*60000]}}}, num : {$sum : 1}}}]);
在命令查询需要加上$add,在代码中需要加上
project().andExpression("{$dateToString:{format:'%Y-%m-%d',date:{$add:{'$createTime',8*60*60000}}}}").as("createTi")
http://www.runoob.com/mongodb/mongodb-intro.html
https://blog.csdn.net/qq_30604989/article/details/81359760