使用Spring Data操作MongoDB--MongoOperations

MongoDB属于NoSQL数据的一种,是一个“存储数据”的系统,增删改查可以添加很多条件,就像SQL数据库一样灵活。

官方文档提供的原生java语句写法虽然种类齐全,但是使用起来极其不便,为此Spring对MongoDB的操作进行了类似于JDBCTemplate的封装。在集成Spring后可以直接使用 MongoOperations 来达到我们的目的。

对于MongoDB如何集成Spring网上有很多教程,我们在这里不再赘述。可以参考下面的链接:

https://www.cnblogs.com/jmcui/archive/2018/03/31/8672492.html

https://www.cnblogs.com/zishengY/p/8467176.html

https://blog.csdn.net/qq_16313365/article/details/70142729

 

一、插入一条数据

mongoOperations.insert();

使用mongoOperations来向数据库插入数据时,是不需要指定集合名称的,会根据类名来自动创建一个集合,用于存放数据,并且在保存进mongodb后,会自动为数据增加上类的包路径。保存形式如下:

{
        "_id" : ObjectId("5c0651664c6706efff0fcd94"),
        "_class" : "com.ys.mongodb.entity.Cat",     // 应该是spring在向mogodb中插入时自动添加的
        "name" : "大咪",
        "sex" : "female",
        "age" : 5,
        "hobbyList" : [
                "玩毛线球",
                "看电视",
                "凝望",
                "吃小鱼干"
        ],
        "createTime" : ISODate("2018-12-04T10:05:26.471Z"),
        "master" : "刘小皮"
}

 

二、同样的mongoOperations也支持批量插入的操作

mongoOperations.insertAll();

三、指定查询文档

Criteria criteria = Criteria.where("name").is(name);
Query query = new Query(criteria);
mongoOperations.find(query, Cat.class);

mongoOperations将所有你想要指定的条件都封装为一个Query对象,这样你在进行条件查询,删除,更新等操作时,可以很方便的复用Query对象,而不需要为每一个条件一样,但操作不一样的语句写一遍条件。在实际使用中,Criteria用于指定文档中的具体信息,Query则用于指定一些排序,分页的逻辑。

1、组合条件查询

很多时候,我们需要查询的条件不止一个,而是有很多的联合起来的。这个时候,可以使用Criteria.and和Criteria.or来将条件进行连接。例如下面根据name与age进行查询:

        Criteria criteria = Criteria.where("name").is(name);
        criteria.and("age").is(1);

根据name或者age查询则改为这样:

        Criteria criteria = Criteria.where("name").is(name);
        criteria.or("age").is(1);

 

2、如果文档中包含数组,又想根据数据中的数据来作为条件,可以这样写

        Criteria criteria = Criteria.where("hobbyList").in(hobbyList);

构建一个对应的list就可以根据我们所构建的list来精确匹配数组中的元素,注意上面的写法是精确匹配,模糊匹配的语句类似,大家自己探索。

 

3、分页与排序

mongoOperations的操作实际上封装与jdbcTemplate类似,因此在分页与排序上语法类似。

分页:

Pageable pageable = new PageRequest(offset,limit);
query.with(pageable);

排序:

        Query query = new Query().with(new Sort(Sort.Direction.DESC,"createTime"));

 

四、范围条件

        Criteria criteria = Criteria.where("age").gte(min).lte(max);
        Query query = new Query(criteria);

上面的例子演示了范围为 min<=age<=max的条件,注意这里不能分为

Criteria.where("age").gte(min);
Criteria.where("age").lte(max);

这样的两条语句来写,会报重复条件名称错误。

 

下面的代码演示了对实体类Cat的基本mongoDB操作

com.ys.mongodb.entity.Cat

package com.ys.mongodb.entity;

import lombok.*;

import java.util.Date;
import java.util.List;

/**
 * @author yangshuo
 * @date 2018/12/4 16:11
 */
@Builder
@Setter
@Getter
@ToString
public class Cat {
    private String name;
    private String sex;
    private Integer age;
    private List<String> hobbyList;
    private Date createTime;
    private String master;
}

com.ys.mongodb.dao.CatOperations

package com.ys.mongodb.dao;

import com.ys.mongodb.entity.Cat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @author yangshuo
 * @date 2018/12/4 16:18
 */
@Service
public class CatOperations {

    @Autowired
    private MongoOperations mongoOperations;

    /**
     * 向mongodb中插入一条数据
     */
    public void insert(Cat cat){
        mongoOperations.insert(cat);
    }

    /**
     * 批量插入
     */
    public void batchInsert(List<Cat> catList){
        mongoOperations.insertAll(catList);
    }

    /**
     * 根据名字查询
     */
    public List<Cat> queryByName(String name){
        Criteria criteria = Criteria.where("name").is(name);
        Query query = new Query(criteria);
        return mongoOperations.find(query, Cat.class);
    }

    /**
     * 组合条件查询
     */
    public List<Cat> queryByNameAndAge(String name, int age){
        Criteria criteria = Criteria.where("name").is(name);
        criteria.and("age").is(1);
        Query query = new Query(criteria);
        return mongoOperations.find(query, Cat.class);
    }

    /**
     * 根据list里的数据查询
     */
    public List<Cat> queryByHobbyList(List<String> hobbyList){
        Criteria criteria = Criteria.where("hobbyList").in(hobbyList);
        Query query = new Query(criteria);
        return mongoOperations.find(query, Cat.class);
    }

    /**
     * 根据时间排序
     */
    public List<Cat> orderByCreateTime(){
        Query query = new Query().with(new Sort(Sort.Direction.DESC,"createTime"));
        return mongoOperations.find(query, Cat.class);
    }

    /**
     * 根据年龄区间查询
     */
    public List<Cat> queryByAgeRange(int min, int max){
        Criteria criteria = Criteria.where("age").gte(min).lte(max);
        Query query = new Query(criteria);
        return mongoOperations.find(query, Cat.class);
    }

    /**
     * 其余的条件删除与更新都是先拼好Query与查询类型
     * 只是换了最后调用的函数,这里不再演示
     */
    public void deleteAll(){
        mongoOperations.dropCollection(Cat.class);
    }
}

com.ys.mongodb.dao.CatOperationsTest

package com.ys.mongodb.dao;

import com.ys.mongodb.entity.Cat;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import static org.junit.Assert.*;

/**
 * @author yangshuo
 * @date 2018/12/4 17:49
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
@Slf4j
public class CatOperationsTest {

    @Autowired
    private CatOperations catOperations;

    @Test
    public void insert() throws Exception {
        List<String> hobbyList = new ArrayList<String>();
        hobbyList.add("玩毛线球");
        hobbyList.add("凝望");
        hobbyList.add("吃小鱼干");
        Cat cat = Cat.builder().name("小咪")
                .sex("female")
                .age(1)
                .hobbyList(hobbyList)
                .createTime(new Date())
                .master("刘忽悠")
                .build();
        catOperations.insert(cat);
    }

    @Test
    public void batchInsert() throws Exception {
        List<Cat> cats = new ArrayList<>();
        List<String> hobbyList = new ArrayList<>();
        hobbyList.add("玩毛线球");
        hobbyList.add("看电视");
        hobbyList.add("凝望");
        hobbyList.add("吃小鱼干");
        Cat cat = Cat.builder().name("大咪")
                .sex("female")
                .age(5)
                .hobbyList(hobbyList)
                .createTime(new Date())
                .master("刘小皮")
                .build();
        cats.add(cat);
        Cat cat1 = Cat.builder().name("阿飞")
                .sex("female")
                .age(3)
                .hobbyList(hobbyList)
                .createTime(new Date())
                .master("刘傻瓜")
                .build();
        cats.add(cat1);
        catOperations.batchInsert(cats);
    }

    @Test
    public void queryByName() throws Exception {
        List<Cat> cats = catOperations.queryByName("小咪");
        log.info("按名字查询:{}",cats);
    }

    @Test
    public void queryByNameAndAge() throws Exception {
        List<Cat> cats = catOperations.queryByNameAndAge("阿飞", 3);
        log.info("按名字与年龄查询:{}",cats);
    }

    @Test
    public void queryByHobbyList() throws Exception {
        List<String> hobbyList = new ArrayList<String>();
        hobbyList.add("玩毛线球");
        hobbyList.add("凝望");
        hobbyList.add("吃小鱼干");
        List<Cat> cats = catOperations.queryByHobbyList(hobbyList);
        log.info("精确查询数组中的数据:{}",cats);
    }

    @Test
    public void orderByCreateTime() throws Exception {
        List<Cat> cats = catOperations.orderByCreateTime();
        log.info("按照时间排序:{}",cats);
    }

    @Test
    public void queryByAgeRange() throws Exception {
        List<Cat> cats = catOperations.queryByAgeRange(2, 5);
        log.info("按照年龄范围查询:{}",cats);
    }

    @Test
    public void deleteAll() throws Exception {
        catOperations.deleteAll();
    }

}

微信公众号:二虎程序

 

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
注:下文中的 *** 代表文件名中的组件名称。 # 包含: 中文-英文对照文档:【***-javadoc-API文档-中文(简体)-英语-对照版.zip】 jar包下载地址:【***.jar下载地址(官方地址+国内镜像地址).txt】 Maven依赖:【***.jar Maven依赖信息(可用于项目pom.xml).txt】 Gradle依赖:【***.jar Gradle依赖信息(可用于项目build.gradle).txt】 源代码下载地址:【***-sources.jar下载地址(官方地址+国内镜像地址).txt】 # 本文件关键字: 中文-英文对照文档,中英对照文档,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压 【***.jar中文文档.zip】,再解压其中的 【***-javadoc-API文档-中文(简体)版.zip】,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·本文档为双语同时展示,一行原文、一行译文,可逐行对照,避免了原文/译文来回切换的麻烦; ·有原文可参照,不再担心翻译偏差误导; ·边学技术、边学英语。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值