mongodb操作以及在spring boot中的操作

什么是mongodb

mongodb:MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

mongodb的使用

现在我们很多项目都会使用到mongodb,尤其对于那些经常写入的数据,其次就是mongodb本身也是很强大的。在使用mongodb的时候千万要注意一件事情:就是不能将他与关系型数据库相提并论。你不能用关系型数据库的方式去操作mongodb里面的东西。在mongodb中没有多表关联,但是你可以将数据存到一条中,mongodb把表数据叫做文档数据,将表称为集合。mongodb中也有基本的增删改查的功能,但是对于稍微复杂的数据就无法使用了,就要使用聚合功能。可以使用mongodb的客户端来进行操作,推荐使用robo-3t.
一、mongodb的基本功能
如果是基于mongodb客户端的操作,那么可以直接去这个链接去查看:http://www.runoob.com/mongodb/mongodb-query.html,这里面的基本操作都有,你也可以自己对着客户端去操作一波.
我这边就将一下在java中如何操作。我这边主要是针对于spring boot的。
首先我们要导入mongodb的依赖

         <dependency> 
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency> 

然后我们建立一个实体类实现序列化的接口。到时候我们这个实体其实就是mongodb中的集合.
然后建立我们的业务逻辑层。然后注入 mongodb

     @Autowired
     private MongoTemplate mongoTemplate;

简单的操作可以直接使用改类提供的操作;
1、查询:

@Override
    public 实体findByUsername(String username,String value) {
        // TODO Auto-generated method stub
         Query query=new Query(Criteria.where("userName").is(username).and("字段").is(值));
        return mongoTemplate.findOne(query, 实体.class);
    }

2、增加数据

mongoTemplate.insert(user);
mongoTemplate.insertAll(user);

有两个方法,一个是插入单条数据,另一个相当于批量插入

3、更新数据

Criteria c=Criteria.where("userName").is(username).and("list.resourceId").is(resourceId);
         Query query=new Query(c);
         Update update=new Update().inc("list.$.consumeCout", 1);
         mongoTemplate.updateFirst(query, update,  实体.class);

我这边是更新某条数据的某个字段加1,相当于计数。对于计数的话最好使用mongodb提供的inc,别使用set,如果其他更新的话可以直接使用set来更新。

4、删除数据

 mongoTemplate.remove()

使用这个能删除这个文档,相当于删除整条数据


二、mongodb复杂数据的处理
这些简单的操作其实理论上是不用讲的,但是居然涉及到了就提了下,下面就要去操作复杂的数据了
比如这样的数据这里写图片描述
用java的解释就是对象里面放对象数组,如果我们要操作这条数据中list数组里面的某个对象的数据的时候就不知道怎么办了。如果我们使用关系数据库的话,那么不用我说大家都知道怎么去操作这中数据,但是在nosql中就不一样了,但是mongodb强大的地方就是他提供了聚合的方式来帮我们去完成这样的问题

扫描二维码关注公众号,回复: 1543267 查看本文章
    Criteria c=Criteria.where("userName").is(username).and("list.id").is(id);

         Query query=new Query(c);
         Update update=new Update().inc("list.$.Cout", 1);
         mongoTemplate.updateFirst(query, update,  实体.class);

上面的这个是去更新这条数据中list对象数组中的id为id的对象将他的count的数据加1。

如果我们需要去增加一个对象到list下面呢,可能我们想到的是使用update中那个简单的方法,但是如果用那种方式的话就会出现你新增进去了,但是你的数据结构变了,可能会出现list[10]下面又是一个对象数组。这时候我们就要使用mongodb中对数组的操作了。其实也不是很难,mongodb提供我们队数组的操作:
pop、push、addtoset、pull 等操作,这个可以自己去了解一下,比如他们之前的区别,我这边就不一一介绍了。

 Query query = Query.query(Criteria.where("userName").is(s));  
                Update update = new Update();
                Update.AddToSetBuilder ab = update.new AddToSetBuilder("list");  
                update = ab.each(icList);  
                mongoTemplate.upsert(query, update, 实体.class);

这上面的代码代表的意思就是将icListlist对象插入到list数组里面,这个addtoset有去重复的作用,就相当于如果数据重复这条数据就不会插入。
好像说了这么久也没有使用到聚合:
下面就直接说如何去操作聚合:
我们上面已经说了曾改数据等,但是那个修改其实是最简单的改。比如我们想将我们的数据list对想给拿出来,这个时候我们就不好办了,因为我们存在mongodb中其实就是一条数据,但是我们list里面有10条,我们想要将数据拆成10条,可能有人说怎么会有这样的要求呢?但是如果是因为考虑到分页呢?哈哈,一条数据还分什么页啊.所以这时候我们的聚合操作就显示他强大的一面:

int limit1 =(page-1)*pageSize;
         Query query=new Query();
        Criteria c=new Criteria();
         if(username==null){
            c=Criteria.where("userNameLength").is(32).and("orgId").is(orgId);
             query.addCriteria(c);
         }else{
            c=Criteria.where("userName").is(username).and("orgId").is(orgId);
             query.addCriteria(c);
         }
        实体 listIc=mongoTemplate.findOne(query, 实体.class);
         if(listIc==null){
             return new List<实体>(page, pageSize, 0, Collections.emptyList());
         }
         Aggregation a=Aggregation.newAggregation(Aggregation.unwind("list"),Aggregation.match(c),
                    Aggregation.group("list.字段1","list.字段2","list.method","list.字段3",
                            "list.字段4","list.字段5","list.字段6","list.字段7"),
                    Aggregation.skip(limit1),
                    Aggregation.limit(pageSize)
                    );
            AggregationResults<实体> results = mongoTemplate.aggregate(a, "interfaceConsume", 实体.class);
            List<实体> list=results.getMappedResults();
            return new List<实体>(page, pageSize, listIc.getList().size(),
                 list);

这个上面就完成了我们的需求,聚合的操作可以先了解下,我这边就直接说了,我们通过聚合操作中的unwind将数组数据进行拆分,list就是我们要拆分的字段。拆分完后我们还有通过分组将有用的数据给提取出来,然后通过skip和limit达到分页的效果。就这简单的几句就能达成我们的分页,但是前期付出的好多努力也是显而易见的。
还有一个就是删除数据,比如我们要移除list中某条数据,这个时候怎么办呢?其实我们之前说过数组的操作有个pop和pull的操作。这个用法可以自己百度下,我这边就直接给出操作

    DBObject query=new BasicDBObject();
        if(level !=-1){
            Map<String, Object> map=new HashMap<>();
            map.put("name", name);
            query.putAll(map);
        }
        BasicDBObject updateObject =new BasicDBObject( "$pull", new BasicDBObject().append("list",
                new BasicDBObject("id",id)));
        mongoTemplate.getCollection("集合").updateMulti(query,updateObject);

上面的简单几句就可以将我们某条数据中name为name且list对象数组中id为id的数据删除。之前在这边踩过好多坑,比如使用unset等用法,不过后面发现都没有用,mongodb中还有好多用法,这些需要我们碰到的过程才去解决。

猜你喜欢

转载自blog.csdn.net/u013825231/article/details/79948818