- NoSQL(Not Only SQL),即反SQL运动或者是不仅仅SQL,指的是非关系型的数据库,是一项全新的数据库革命运动,是一种全新的思维注入
- NoSQL优点
- 数据库高并发读写
- 海量数据高效率存储和访问
- 数据库高扩展性和高可用性
- NoSQL缺点
- 数据库事务一致性需求
- 数据库的写实时性和读实时性需求
- 复杂的SQL查询,特别是夺标关联查询的需求
- MongoDB概述
- 由C++语言编写,是一个基于分布式文件存储的开源数据库系统;在高负载的情况下,添加更多的节点,可以保证服务器性能
- MongoDB旨在为WEB应用提供可扩展的高性能数据存储解决方案;将数据存储为一个文档,数据结构由键值对组成。MongoDB文档类似于JSON对象字段值可以包含其他问你当、数组及文档数组
- MongoDB特点
- MongoDB是一个面向文档存储的数据库,操作起来比较简单和容易
- MongoDB记录总可以设置任何属性的索引
- 可以通过本地后者网络创建数据镜像,这使得MongoDB有更强的扩展性
- 如果负载的增减(需要跟多的存储空间和更强的处理能力),它可以分布在计算机网络中的其他节点上,这就是所谓的分片
- MongoDB支持丰富的查询表达式,查询指令使用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语法:略
- SpringBoot整合MongoDB
- 集成简介:spring-data-mongodb提供了MongoTemplate和MongoRepository两种方式访问MongoDB;MongoTemplate操作灵活,MongoRepository操作简单,不够灵活
- 添加相关依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
- 添加配置
spring.data.mongodb.uri=mongodb://Your IP:27017/your database
- 创建与集合对应的实体类
@Data
@Document(\"User\") // 表示操作的是your database下的User集合
public class User {
@Id
private String id;
private String name;
private Integer age;
}
- 测试MongoTemplate访问MongoDB(CRUD)
@SpringBootTest
public class MongoDBTest {
@Autowired
private MongoTemplate mongoTemplate;
/** 新增 */
@Test
public void insert() {
User user = new User();
user.setName(\"xiansen\");
user.setAge(18);
User u = mongoTemplate.insert(user);
System.out.println(\"user = \" + u);
}
/** 查询所有记录 */
@Test
public void findAll() {
List<User> all = mongoTemplate.findAll(User.class);
System.out.println(\"all = \" + all);
}
/** ID查询 */
@Test
public void findById() {
User u = mongoTemplate.findById(\"rge8vcuxdfsfdfsdf\", User.class);
System.out.println(\"u = \" + u);
}
/** 条件查询 */
@Test
public void findUserList() {
Query query = new Query(Criteria.where(\"name\").is(\"xiansen\").and(\"age\").is(18));
List<User> users = mongoTemplate.find(query, User.class);
System.out.println(\"users = \" + users);
}
/** 模糊查询 */
@Test
public void findUserListByLike() {
String name = \"xian\";
String regex = String.format(\"%s%s%s\", \"^.*\", name, \".*$\");
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); // 大小写敏感
Query query = new Query(Criteria.where(\"name\").regex(pattern)); // 使用正则表达式实现模糊查询
List<User> users = mongoTemplate.find(query, User.class);
System.out.println(\"users = \" + users);
}
/** 分页查询 */
@Test
public void findPageUserList() {
int current = 1;
int limit = 3;
String name = \"xian\";
String regex = String.format(\"%s%s%s\", \"^.*\", name, \".*$\");
Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE); // 大小写敏感
Query query = new Query(Criteria.where(\"name\").regex(pattern));
// 查询的记录数
Long count = mongoTemplate.count(query, User.class);
System.out.println(\"count = \" + count);
// 分页查询
List<User> users = mongoTemplate.find(query.skip((current-1)*limit).limit(limit), User.class);
System.out.println(\"users = \" + users);
}
/** 修改 */
@Test
public void updateUser() {
User u = mongoTemplate.findById(\"ds98h98sdhds6gt7u\", User.class);
u.setName(\"hello\");
u.setAge(20);
Query query = new Query(Criteria.where(\"_id\").is(u.getId()));
Update update = new Update();
update.set(\"name\", u.getName());
update.set(\"age\", u.getAge());
UpdateResult upsert = mongoTemplate.upsert(query, update, User.class);
long modifiedCount = upsert.getModifiedCount(); // 影响的行数
System.out.println(\"modifiedCount = \" + modifiedCount);
}
/** 删除 */
@Test
public void deleteUser() {
Query query = new Query(Criteria.where(\"_id\").is(\"ds98h98sdhds6gt7u\"));
DeleteResult remove = mongoTemplate.remove(query, User.class);
long deletedCount = remove.getDeletedCount(); // 影响的行数
System.out.println(\"deletedCount = \" + deletedCount);
}
}
- 相比于MongoTemplate,MongoRepository实现CRUD操作,还需要创建一个继承MongoRepository接口的接口,如
@Repository
public interface UserRepository extends MongoRepository<User, String> {}
- 测试MongoRepository访问MongoDB(CRUD)
@SpringBootTest
public class MongoDBTest {
@Autowired
private UserRepository userRepository;
/** 新增 */
@Test
public void insert() {
User user = new User();
user.setName(\"xiansen\");
user.setAge(18);
User u = userRepository.save(user);
System.out.println(\"user = \" + u);
}
/** 查询所有记录 */
@Test
public void findAll() {
List<User> all = userRepository.findAll();
System.out.println(\"all = \" + all);
}
/** ID查询 */
@Test
public void findById() {
User u = userRepository.findById(\"rge8vcuxdfsfdfsdf\").get();
System.out.println(\"u = \" + u);
}
/** 条件查询 */
@Test
public void findUserList() {
User user = new User();
user.setName(\"xiansen\");
user.setAge(18);
Example<User> userExample = Example.of(user);
List<User> users = userRepository.findAll(userExample);
System.out.println(\"users = \" + users);
}
/** 模糊查询 */
@Test
public void findUserListByLike() {
User user = new User();
user.setName(\"xian\");
user.setAge(18);
ExampleMatcher matcher = ExampleMatcher.matching()
.withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) // 表示模糊查询
.withIgnoreCase(true); // 忽略大小写
Example<User> userExample = Example.of(user, matcher);
List<User> users = userRepository.findAll(userExample);
System.out.println(\"users = \" + users);
}
/** 分页查询 */
@Test
public void findPageUserList() {
// 分页设置参数
Pageable pageable = PageRequest.of(0, 3);// 0表示第一页
User user = new User();
user.setName(\"xiansen\");
user.setAge(18);
Example<User> userExample = Example.of(user);
Page<User> page = userRepository.findAll(userExample, pageable);
System.out.println(\"page = \" + page);
}
/** 修改 */
@Test
public void updateUser() {
User u = userRepository.findById(\"ds98h98sdhds6gt7u\").get();
u.setName(\"hello\");
u.setAge(20);
User user = userRepository.save(u);
System.out.println(\"user = \" + user);
}
/** 删除 */
@Test
public void deleteUser() {
userRepository.deleteById(\"ds98h98sdhds6gt7u\");
}
}
来源:https://www.cnblogs.com/aitiknowledge/p/16529180.html
本站部分图文来源于网络,如有侵权请联系删除。