MongoDB介绍
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
MongoDB的特点
1、MongoDB 是一个面向文档存储的数据库,操作起来比较简单和容易。
你可以在MongoDB记录中设置任何属性的索引 (如:FirstName=“Sameer”,Address=“8 Gandhi Road”)来实现更快的排序。
你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。
如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。
2、Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
3、MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。
4、Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。
5、Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。
6、Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
7、GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
8、MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
9、MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
10MongoDB安装简单。
下面来说说在spring boot中整合MongoDB的例子
创建项目
创建项目时,添加web以及spring data mongodb、spring security依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-test</artifactId>
<scope>test</scope>
</dependency>
MongoDB的配置
spring.data.mongodb.authentication-database=admin #mongo默认的一个admin库
spring.data.mongodb.database=zhouym #随便起一个name
spring.data.mongodb.host=10.0.0.13 #mongodb的ip
spring.data.mongodb.port=27017 #mongodb的默认端口
spring.data.mongodb.username=zhouym #mongodb的用户名
spring.data.mongodb.password=123 #mongodb的密码
MongoDB的使用
创建一个book类
package com.zhouym.mongodb;
/**
* 〈〉
*
* @author zhouym
* @create 2019/8/28
* @since 1.0.0
*/
public class Book {
private Integer id;
private String name;
private String auth;
public Book() {
}
public Book(Integer id, String name, String auth) {
this.id = id;
this.name = name;
this.auth = auth;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuth() {
return auth;
}
public void setAuth(String auth) {
this.auth = auth;
}
@Override
public String toString() {
return "Book{" +
"id=" + id +
", name='" + name + '\'' +
", auth='" + auth + '\'' +
'}';
}
}
创建一个接口类,并继承MongoRepository
package com.zhouym.mongodb;
import org.springframework.data.mongodb.repository.MongoRepository;
import java.util.List;
public interface MongoDbBook extends MongoRepository<Book,Integer> {
}
来看看这个MongoRepository类的源码
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//
package org.springframework.data.mongodb.repository;
import java.util.List;
import org.springframework.data.domain.Example;
import org.springframework.data.domain.Sort;
import org.springframework.data.repository.NoRepositoryBean;
import org.springframework.data.repository.PagingAndSortingRepository;
import org.springframework.data.repository.query.QueryByExampleExecutor;
@NoRepositoryBean
public interface MongoRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor<T> {
<S extends T> List<S> saveAll(Iterable<S> var1);
List<T> findAll();
List<T> findAll(Sort var1);
<S extends T> S insert(S var1);
<S extends T> List<S> insert(Iterable<S> var1);
<S extends T> List<S> findAll(Example<S> var1);
<S extends T> List<S> findAll(Example<S> var1, Sort var2);
}
可以看到有点类似于Jpatemplate那一套东西,里面对应封装了插入、查找的方法
我们在测试类中测试
package com.zhouym.mongodb;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest
public class MongodbApplicationTests {
@Autowired
MongoDbBook mongoDbBook;
@Test
public void contextLoads() {
Book book = new Book();
book.setId(2);
book.setName("西游记");
book.setAuth("吴承恩");
mongoDbBook.insert(book);
}
}
测试获取数据
package com.zhouym.mongodb;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest
public class MongodbApplicationTests {
@Autowired
MongoDbBook mongoDbBook;
@Test
public void test(){
List<Book> books = mongoDbBook.findAll();
System.out.println(books);
}
}
在MongoRepository源码中我们发现方法的参数是对象,那么如果我想通过一个name进行查找呢,也是可以的,需要我们在自定义的接口类中定义方法
如下,定义了一个根据name查找的方法
package com.zhouym.mongodb;
import org.springframework.data.mongodb.repository.MongoRepository;
import java.util.List;
public interface MongoDbBook extends MongoRepository<Book,Integer> {
List<Book> findBookByNameContaining(String name);
}
我们在测试类中测试看看
package com.zhouym.mongodb;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest
public class MongodbApplicationTests {
@Autowired
MongoDbBook mongoDbBook;
@Test
public void test1(){
List<Book> books = mongoDbBook.findAll();
System.out.println(books);
List<Book> book = mongoDbBook.findBookByNameContaining("西");
System.out.println(book);
}
}
还有一种方式,可以使用MongoTemplate模板类,跟前面的用法差不多
package com.zhouym.mongodb;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest
public class MongodbApplicationTests {
@Autowired
MongoTemplate mongoTemplate;
@Test
public void test2(){
Book book = new Book();
book.setId(3);
book.setName("红楼梦");
book.setAuth("曹雪芹");
mongoTemplate.insert(book);
List<Book> books = mongoTemplate.findAll(Book.class);
System.out.println(books);
}
}