java整合MongoDB4.0 - Go语言中文社区

java整合MongoDB4.0


MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
在这里插入图片描述

ssm整合

1、导入依赖

<!-- 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>

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

3、配置MongoDB的配置文件

在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文件中,全引用这个文件

4、将mongodb.xml文件引入spring.xml文件中好一起加载

<import resource="classpath:mongodb-config.xml"/>

5、最后进行测试

//实体

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

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_36193940/article/details/85075806
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-06-30 10:30:55
  • 阅读 ( 1814 )
  • 分类:数据库

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢