java整合MongoDB4.0

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

ssm整合

1、导入依赖




    org.springframework.data
    spring-data-mongodb
    2.1.1.RELEASE




    org.mongodb
    mongo-java-driver
    3.8.2

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文件




    
    

    
    
    
    
    
    
    
    
    
    
        
        
        
        
    

这里遇到一个问题,因为之前项目中本来就用了mysql,然后有一个 jdbc.properties文件已经导入到项目中,因此我一开始也是向导入 jdbc.properties一样使用,结果报错:
“Could not resolve placeholder”
原因是Spring在管理配置文件的时候冲突了,因此需要在导入的配置项目中加上:ignore-unresolvable=“true” 或者 全写到一个resoure.properties文件中,全引用这个文件

4、将mongodb.xml文件引入spring.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 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.调用接口时报错
java整合MongoDB4.0_第2张图片
是因为当时设置了访问需要账号密码没有在mongo:mongo-client中加上
credentials="${mongo.username}:${mongo.password}@${mongo.database}
连接用户密码库信息
3.创建实体时id须为String类型,为Long时报错,因为当时保存的时候没有setId所以mongodb用的自带生成的id 5c1aff49df18a54dbd4654eb ObjectId类型的,所以取得时候报错,如果想要别的类型的id,需要保存时setId
java整合MongoDB4.0_第3张图片
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

你可能感兴趣的:(mongodb)