一、概述
MongoDB中的记录是一个文档,它是一个数据结构组成 字段和值对。MongoDB文档类似于JSON对象。
字段的值可能包括其他文档、数组、 和文档数组:
- 数据库(Database):和关系型数据库一样,每个数据库中有自己的用户权限,不同的项目组可以使用不同的数据库
- 集合(Collection): 集合指的是文档组(类似于 Mysql 中的表的概念),里面可以存储许多文档
- 文档(Document): 文档是 MongoDB 中最基本的数据单元,由键值对组成,类似于 JSON 格式,可以存储不同字段,字段的值可以包括其他文档、数组和文档数组
官网:MongoDB: The Developer Data Platform | MongoDB
二、主要特点
1、高性能
MongoDB提供高性能的数据持久性。特别
- 对嵌入式数据模型的支持减少了数据库上的 I/O 活动 系统。
- 索引支持更快的查询,并且可以包含来自嵌入式的键 文档和数组。
2、查询接口
MongoDB Query API 支持读写 操作(CRUD)以及:
- 数据聚合
- 文本搜索和地理空间查询。
3、高可用性
MongoDB的复制工具,称为副本集提供:
- 自动故障转移
- 数据冗余。
一个副本集是一组 维护相同数据集的MongoDB服务器,提供冗余 以及提高数据可用性。
4、水平可扩展性
MongoDB提供水平可扩展性作为其核心功能的一部分:
- 分片跨 计算机群集。
- 从3.4开始,MongoDB支持创建区的数据基于分片键.在一个 平衡集群,MongoDB直接读取和写入区域覆盖 只到区域内的那些碎片。请参阅的区手册页了解更多信息。
5、支持多个存储引擎
MongoDB支持多个存储引擎:
- WiredTiger 存储引擎(包括对静态加密)
- In-Memory存储引擎。
此外,MongoDB提供了可插拔的存储引擎API,允许 为MongoDB开发存储引擎的第三方
6、MongoDB的体系结构与术语
MongoDB 是最像关系型数据库的非关系型数据库,之所以这样子说,是因为它的体系结构和MySQL 是比较像的。
我们通过对比的形式对 MongoDB 的体系结构做一个初步的了解。
SQL术语/概念 |
MongoDB术语/概念 |
解释/说明 |
database |
database |
数据库 |
table |
collection |
数据库表/集合 |
row |
document |
表中的一条数据 |
column |
field |
数据字段/域 |
index |
index |
索引 |
table joins |
表连接,MongoDB不支持 |
|
primary key |
primary key |
主键,MongoDB自动将_id字段设置为主键 |
三、SpringBoot整合MongoDB
1、添加MongoDB依赖
Spring Data MongDB 是Spring Data的下的一个模块,在SpringBoot中整合MongoDB就需要添加Spring Data MongDB的依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>
2、配置文件
spring: data: mongodb: host: 192.168.136.160 port:27017 database:leo username:admin password:123456
3、实例代码
主要注解:
@Document,文档是 MongoDB 中最基本的数据单元,由键值对组成,类似于 JSON 格式,可以存储不同字段,字段的值可以包括其他文档,数组和文档数组。
@Id(主键):用来将成员变量的值映射为文档的_id的值
@Indexed(索引): 索引是一种特殊的数据结构,存储在一个易于遍历读取的数据集合中,能够对数据库文档中的数据进行排序。索引能极大提高文档查询效率,如果没有设置索引,MongoDB 会遍历集合中的整个文档,选取符合查询条件的文档记录。这种查询效率是非常低的。
@Field(字段): 文档中的字段,类似于 MySql 中的列。
@Aggregation(聚合): 聚合主要用于数据处理,例如统计平均值、求和等。
import org.springframework.data.annotation.Id; import org.springframework.data.mongodb.core.mapping.Document; @Document(collection = "Book") public class Book { @Id private String id; private String title; private String author; private String summary; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getSummary() { return summary; } public void setSummary(String summary) { this.summary = summary; } }
SpringBoot操作MongoDB有两种方式,分别是继承MongoRepository类和service注入MongoTemplate
MongoRepository方式:
Repository是用于操作数据库的类
package com.palmer.rachelle.javaspringmongodb.repository; import com.palmer.rachelle.javaspringmongodb.model.Book; import org.springframework.data.mongodb.repository.MongoRepository; import java.util.List; public interface BookRepository extends MongoRepository<Book, String> { List<Book> findByTitleStartsWithOrAuthor(String title, String author); }
Controller代码:
import com.palmer.rachelle.javaspringmongodb.model.Book; import com.palmer.rachelle.javaspringmongodb.repository.BookRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import java.util.List; @Controller public class BookController { @Autowired private BookRepository bookRepository; /** * Handles listing of all books and searching. * @param model * @return */ @GetMapping({"/index", "/search"}) public String showBooks(Model model, String keyword) { if (keyword != null) { model.addAttribute("books", this.bookRepository.findByTitleStartsWithOrAuthor(keyword, keyword)); model.addAttribute("keyword", keyword); } else { List<Book> books = this.bookRepository.findAll(); model.addAttribute("books", books); } return "index"; } /** * Show form for adding a book document * @param book * @return */ @GetMapping("/add-book") public String showAddBookForm(Book book) { return "add-book"; } /** * This will CREATE a books. C of CRUD. * @param book * @param result * @param model * @return */ @PostMapping("/add-book") public String addBook(Book book, BindingResult result, Model model) { if (result.hasErrors()) { return "add-book"; } this.bookRepository.save(book); return "redirect:/index"; } /** * Show form for editing a book document. The R in CRUD. * @param id * @param model * @return */ @GetMapping("/edit-book/{id}") public String showUpdateForm(@PathVariable("id") String id, Model model) { Book book = this.bookRepository.findById(id).orElseThrow(() -> new IllegalArgumentException("Invalid book Id:" + id)); model.addAttribute("book", book); return "edit-book"; } /** * This will update a book document. The U in CRUD * @param id * @param book * @param result * @param model * @return */ @PostMapping("/edit-book/{id}") public String updateBook(@PathVariable("id") String id, Book book, BindingResult result, Model model) { if (result.hasErrors()) { book.setId(id); return "edit-book"; } this.bookRepository.save(book); return "redirect:/index"; } /** * This will delete a book document. The D in CRUD. * @param id * @param model * @return */ @GetMapping("/delete-book/{id}") public String deleteUser(@PathVariable("id") String id, Model model) { Book book = this.bookRepository.findById(id).orElseThrow(() -> new IllegalArgumentException("Invalid book Id:" + id)); this.bookRepository.delete(book); return "redirect:/index"; } }
MongoTemplate实现方式:
MongoTemplate是由org.springframework.data.mongodb.corepacket 提供一个Java类。它提供了一组用于与MongoDB交互的丰富特性,并充当Spring的MongoDB支持的中心类。此外,MongoTemplate是线程安全的,可以跨多个实例调用。MongoTemplate类实现了接口MongoOperations,提供了流畅的API进行Query, Criteria, Update等基本操作,此外,也支持泛型的方法实现。使用起来也非常方便,可直接将MongoTemplate作为类中的属性来使用。
import java.util.List; /** * @author * @version 1.0 * @date 2022/12/17 15:33 */ public interface BookService { List<Book> findAll(); NewUser findById(String BookId); NewUser save(Book book); void deleteById(String BookId); }
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 java.util.List; public class BookServiceImpl implements BookService { @Autowired private MongoTemplate template; @Override public List<Book> findAll() { return template.findAll(Book.class); } @Override public Book findById(String BookId) { return template.findById(BookId,Book.class); } @Override public Book save(Book book) { template.save(book); return book; } @Override public void deleteById(String BookId) { Query query = new Query(); query.addCriteria(Criteria.where("id").is(BookId)); template.remove(query, Book.class); } }
@RestController @RequestMapping("/book") public class BookController { @Autowired private final BookService bookService; @GetMapping("") public List<Book> getAllBooks() { return bookService.findAll(); } @GetMapping("/{userId}") public Book getByBookId(@PathVariable String bookId) { return bookService.findById(bookId); } @PostMapping("/addNewBook") @ResponseBody public Book addNewBook(@RequestBody Book book) { return bookService.save(book); } @DeleteMapping("/{bookId}") public String delete(@PathVariable String bookId) { Book book = new Book(); book.setId(bookId); bookService.deleteById(bookId); return "deleted: " + bookId; } @PutMapping("") public Book update(@RequestBody Book book) { return bookService.save(book); } }
Doker 技术人的数码品牌!!!
文章下方有交流学习区!一起学习进步!也可以前往官网,加入官方微信交流群!!!你的支持和鼓励是我创作的动力❗❗❗
官网:Doker 多克; 官方旗舰店:首页-Doker 多克创新官方店-淘宝网全品大优惠优惠!!!