社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
<!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-mongodb -->
<!--MongoDB核心包-->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.mongodb/mongo-java-driver -->
<!--MongoDB驱动包 这个可加可不加 新版本的核心包里已经含有这个驱动包 不加最好-->
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.8.2</version>
</dependency>
在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文件
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mongo="http://www.springframework.org/schema/data/mongo"
xsi:schemaLocation="http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/data/mongo
http://www.springframework.org/schema/data/mongo/spring-mongo.xsd
">
<!--1 .加载mongodb的属性配置文件 -->
<context:property-placeholder location="classpath:resoure.properties" />
<!--2 .服务器连接信息-->
<mongo:mongo-client id="mongo" host="${mongo.host}" port="${mongo.port}" credentials="${mongo.username}:${mongo.password}@${mongo.database}">
<mongo:client-options
connections-per-host="${mongo.connectionsPerHost}"
threads-allowed-to-block-for-connection-multiplier="${mongo.threadsAllowedToBlockForConnectionMultiplier}"
connect-timeout="${mongo.connectTimeout}"
max-wait-time="${mongo.maxWaitTime}"
socket-keep-alive="${mongo.socketKeepAlive}"
socket-timeout="${mongo.socketTimeout}"/>
</mongo:mongo-client>
<!--3 .mongo 为mongo:mongo-client 的id 创建mongo工厂-->
<mongo:db-factory id="mongoDbFactory" dbname="${mongo.database}" mongo-ref="mongo"/>
<!--4 .创建mongoTemplate模板-->
<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate" lazy-init="false">
<!--<constructor-arg ref="mongo"/>-->
<!-- 设置使用的数据库 名-->
<!--<constructor-arg name="databaseName" value="${mongo.database}"/>-->
<constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
</bean>
</beans>
这里遇到一个问题,因为之前项目中本来就用了mysql,然后有一个 jdbc.properties文件已经导入到项目中,因此我一开始也是向导入 jdbc.properties一样使用,结果报错:
“Could not resolve placeholder”
原因是Spring在管理配置文件的时候冲突了,因此需要在导入的配置项目中加上:ignore-unresolvable=“true” 或者 全写到一个resoure.properties文件中,全引用这个文件
<import resource="classpath:mongodb-config.xml"/>
//实体
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<UserMongodb> 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<UserMongodb> 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<BasicDBObject> 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的版本
<!--MongoDB核心包-->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>2.1.1.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
</exclusion>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
</exclusion>
</exclusions>
</dependency>
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
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!