mongodb 查询效率_SpringBoot2.x教程——NoSQL之SpringBoot整合MongoDB

一. MongoDB

1. MongoDB简介

MongoDB一词来自于英文单词“Humongous”,中文含义为“庞大”,是由C++语言编写的一个基于分布式文件存储的高性能,开源,无模式的文档型数据库,属于当前NoSql数据库中比较热门的一种,可以应用于各种规模的企业、各个行业以及各类应用程序中。

2. MongoDB数据结构

传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,而MongoDB是由数据库(database)、集合(collection)、文档对象(document)三个层次组成。MongoDB中的collection对应了关系型数据库里的表,但是集合中没有列、行和关系概念,这体现了模式自由的特点。

MongoDB支持的数据结构非常松散,是类似于json的bjson格式,因此可以存储比较复杂的数据类型。以下是MongoDB的数据机构类型图:

36a8a61b3a0afca7c3e525eb4872983b.png

MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

3. MongoDB特点

  • Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
  • MongoDB 是一个面向文档存储的数据库,操作起来比较简单和容易。
  • 你可以在MongoDB记录中设置任何属性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")来实现更快的排序。
  • 你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。
  • 如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。
  • Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
  • MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。
  • Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。
  • Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。
  • Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
  • GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
  • MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
  • MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
  • MongoDB安装简单。

二. Spring Boot中整合MongoDB

1. MongoDB安装过程略。

2. 创建web项目

我们按照之前的经验,创建一个web程序,并将之改造成Spring Boot项目,具体过程略。

97f444587723b5c142305b2f7ea5f586.png

3. 添加依赖

org.springframework.boot    spring-boot-starter-data-mongodb

4. 创建application.yml配置文件

server:  port: 8080spring:  application:    name: spirng-boot-mongodb  data:    mongodb:      host: localhost   #同127.0.0.1      port: 27017      database: db01    #指定操作的数据库

4. 创建一个实体类

4.1 MongoDB中相关注解

  • @Id - 文档的唯一标识,在mongodb中为ObjectId,它是唯一的,通过时间戳+机器标识+进程ID+自增计数器(确保同一秒内产生的Id不会冲突)构成。
  • @Document - 声明此类为mongodb的文档实体类,通过collection参数指定这个类对应的文档名称。@Document(collection=”mongodb”) mongodb对应表
  • @Indexed - 声明该字段需要索引,建索引可以大大的提高查询效率。
  • @CompoundIndex - 复合索引的声明,建复合索引可以有效地提高多字段的查询效率。
  • @Transient - 映射忽略的字段,该字段不会保存到mongodb。
  • @PersistenceConstructor - 声明构造函数,作用是把从数据库取出的数据实例化为对象。该构造函数传入的值为从DBObject中取出的数据

4.2 创建Product实体类

package com.yyg.boot.entity;import lombok.Data;import lombok.ToString;import org.springframework.data.annotation.Id;import org.springframework.data.mongodb.core.mapping.Document;import org.springframework.data.mongodb.core.mapping.Field;import java.util.Date;/** * @Author 一一哥Sun * @Date Created in 2020/4/9 * @Description Description */@Data@ToString@Document(collection = "product")public class Product {    @Id    private String id;    /**     * 价格     */    @Field("price")    private Integer price;    /**     * 商品名称     */    @Field("name")    private String name;    /**     * 商品简介     */    @Field("info")    private String info;    /**     * 商品发布者     */    @Field("publisher")    private String publisher;    /**     * 创建时间     */    @Field("createTime")    private Date createTime;    /**     * 修改时间     */    @Field("updateTime")    private Date updateTime;}

5. 创建Service实现类

5.1 定义ProductService

package com.yyg.boot.service;import com.yyg.boot.entity.Product;import java.awt.print.Book;import java.util.List;/** * @Author 一一哥Sun * @Date Created in 2020/4/9 * @Description Description */public interface ProductService {    String saveProduct(Product product);    /**     * 查询所有     */    List findAll();    /***     * 根据id查询     */    Product getProductById(String id);    /**     * 根据名称查询     */    Product getProductByName(String name);    /**     * 更新对象     */    String updateProduct(Product product);    /***     * 删除对象     */    String deleteProduct(Product product);    /**     * 根据id删除     */    String deleteProductById(String id);}

5.2 定义ProductServiceImpl实现类

package com.yyg.boot.service.impl;import com.yyg.boot.entity.Product;import com.yyg.boot.service.ProductService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.mongodb.core.MongoTemplate;import org.springframework.data.mongodb.core.query.Criteria;import org.springframework.data.mongodb.core.query.Query;import org.springframework.data.mongodb.core.query.Update;import org.springframework.stereotype.Service;import java.util.Date;import java.util.List;/** * @Author 一一哥Sun * @Date Created in 2020/4/9 * @Description Description */@Servicepublic class ProductServiceImpl implements ProductService {    @Autowired    private MongoTemplate mongoTemplate;    @Override    public String saveProduct(Product product) {        product.setCreateTime(new Date());        product.setUpdateTime(new Date());        mongoTemplate.save(product);        return "添加成功";    }    @Override    public List findAll() {        return mongoTemplate.findAll(Product.class);    }    @Override    public Product getProductById(String id) {        Query query = new Query(Criteria.where("_id").is(id));        return mongoTemplate.findOne(query, Product.class);    }    @Override    public Product getProductByName(String name) {        Query query = new Query(Criteria.where("name").is(name));        return mongoTemplate.findOne(query, Product.class);    }    @Override    public String updateProduct(Product product) {        Query query = new Query(Criteria.where("_id").is(product.getId()));        Update update = new Update().set("publisher", product.getPublisher())                .set("info", product.getInfo())                .set("updateTime", new Date());        return "success";    }    @Override    public String deleteProduct(Product product) {        mongoTemplate.remove(product);        return "success";    }    @Override    public String deleteProductById(String id) {        //findOne        Product product = getProductById(id);        //delete        deleteProduct(product);        return "success";    }}

6. 创建Controller接口

package com.yyg.boot.web;import com.yyg.boot.entity.Product;import com.yyg.boot.service.ProductService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.*;import java.util.List;/** * @Author 一一哥Sun * @Date Created in 2020/4/9 * @Description Description */@RestController@RequestMapping("/product")public class ProductController {    @Autowired    private ProductService productService;    @PostMapping("")    public String saveProduct(@RequestBody Product product) {        return productService.saveProduct(product);    }    @GetMapping("")    public List findAll() {        return productService.findAll();    }    @GetMapping("/id/{id}")    public Product findOne(@PathVariable("id") String id) {        return productService.getProductById(id);    }    @GetMapping("/name/{name}")    public Product findOneByName(@PathVariable("name") String name) {        return productService.getProductByName(name);    }    @PostMapping("/update")    public String update(@RequestBody Product product) {        return productService.updateProduct(product);    }    @DeleteMapping("/delOne")    public String delOne(@RequestBody Product product) {        return productService.deleteProduct(product);    }    @DeleteMapping("/{id}")    public String delById(@PathVariable("id") String id) {        return productService.deleteProductById(id);    }}

7. 创建Application入口类

package com.yyg.boot;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;/** * @Author 一一哥Sun * @Date Created in 2020/4/9 * @Description Description */@SpringBootApplicationpublic class MongoApplication {    public static void main(String[] args) {        SpringApplication.run(MongoApplication.class, args);    }}

完整项目结构:

68eb450c72890715006b79f1d717b6bd.png

8. 启动测试

我们可以在MongoDB中自己手动创建一个空白的数据库db01。

d5e665557079ea16b09110ca2a64fe41.png

进行添加接口的测试:

8e663c3083696d26c226f054710cc62d.png

再次打开MongoDB,可以看到如下信息:

1b6dc0f0a257f76b42c4f72be6bd88aa.png

进行查询测试:

ba4fe7d1b4003cacb4ea39b0e421154c.png

根据id查询:

62198ccb09a51cc78f566d33861134f4.png

根据name查询:

d9b2b21feabd977c71408dcda1720ded.png

其他接口不再一一测试,都可以正常使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值