MongoDB数据库简介
1、简介
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
它支持的数据结构非常松散,是一种类似JSON的格式叫BSON(“二进制的JSON”),所以它既可以存储比较复杂的数据类型,又相当的灵活。
2、业务应用场景
传统的关系型数据库,在数据库操作的“三高”需求以及对应的Web2.0的网站需求面前,显得力不从心。
三高:
- 对数据库高并发读写
- 对海量数据的高效率存储和访问
- 对数据库的高可扩展和高可用性的需求
应用场景的共同特点:
- 数据量大
- 读写操作频繁
- 价值较低的数据,对事务要求不高
3、概念解析
与关系数据库概念对比:
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
嵌入文档 | MongoDB通过嵌入式文档来替代多表连接(效率更高) | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
4、常用命令
选择切换数据库:
use articledb
插入数据:
db.comment.insert({bson数据})
查询所有数据:
db.comment.find()
条件查询数据:
db.comment.find({条件})
查询符合条件的第一条记录:
db.comment.findOne({条件})
查询符合条件的前几条记录:
db.comment.find({条件}).limit(条数)
查询符合条件的跳过的记录:
db.comment.find({条件}).skip(条数)
修改数据:
db.comment.update({条件},{修改后的数据})
或
db.comment.update({条件},{$set:{要修改部分的字段:数据})
修改数据并自增某字段值:
db.comment.update({条件},{$inc:{自增的字段:步进值}})
删除数据:
db.comment.remove({条件})
统计查询:
db.comment.count({条件})
模糊查询:
db.comment.find({字段名:/正则表达式/})
条件比较运算:
db.comment.find({字段名:{$gt:值}})
包含查询:
db.comment.find({字段名:{$in:[值1,值2]}})
或
db.comment.find({字段名:{$nin:[值1,值2]}})
条件连接查询:
db.comment.find({$and:[{条件1},{条件2}]})
或
db.comment.find({$or:[{条件1},{条件2}]})
5、索引
5.1单字段索引
MongoDB支持在文档的单个字段上创建用户定义的升序/降序索引。对单个字段索引和排序操作,索引键的排序顺序(升或降序)并不重要,MongoDB可以在任何方向上遍历索引。
5.2复合索引
支持多个字段的用户定义索引。复合索引中列出的字段顺序具有重要意义。会按照列出字段顺序保存。如复合索引:{userId:1,score:-1},则索引首先按userId正序排列,然后在每个userId的值内,再按score倒叙排列。
5.3其他索引
地理空间索引、文本索引、哈希索引
创建索引:
db.collection.createIndex(keys, options)
更多命令访问菜鸟教程:https://runoob.com/mongodb/mongodb-tutorial.html
6、整合Spring Boot
pom.xml添加依赖:
<!--mongodb数据库-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
yml文件配置:
spring:
data:
mongodb:
uri: mongodb://localhost:27017/articledb #本机的没有账号和密码(IP:端口/数据库名称)
实体类:
package com.esoon.hello.pojo;
import lombok.Data;
//数据库的实体类,实体类的名字要和数据库Collection名称一样,或者在实体类上加@Document(collection = "数据库集合名称")注解
@Data
public class MongoComment {
private String id;
private String name;
}
controller层:
package com.esoon.hello.controller;
import com.esoon.hello.dao.MongoTestDao;
import com.esoon.hello.pojo.MongoComment;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.List;
import java.util.UUID;
@RestController
public class MongoTestController {
@Resource
private MongoTestDao mongoTestDao;
//插入数据
@GetMapping(value = "saveTest")
public void saveTest() {
MongoComment mongoComment = new MongoComment();
mongoComment.setId(UUID.randomUUID().toString().replace("-", ""));
mongoComment.setName("jack");
mongoTestDao.saveTest(mongoComment);
}
//查询全部
@GetMapping(value = "findAll")
public List<MongoComment> findAll() {
List<MongoComment> list = mongoTestDao.findAll();
list.forEach(s-> System.out.println(s.getId()+s.getName()));
return list;
}
//按name查询
@GetMapping(value = "/findByName/{name}")
public List<MongoComment> findByName(@PathVariable("name") String name) {
List<MongoComment> list = mongoTestDao.findByName(name);
return list;
}
//update更新
@GetMapping(value = "/updateByName/{name}")
public List<MongoComment> updateByName(@PathVariable("name") String name) {
//更新后返回查询所有
List<MongoComment> list = mongoTestDao.updateByName(name);
return list;
}
//删除
@GetMapping(value = "/deleteById/{id}")
public List<MongoComment> deleteById(@PathVariable("id") String id) {
//删除一个后返回查询所有
List<MongoComment> list = mongoTestDao.deleteById(id);
return list;
}
}
调用数据库dao:
package com.esoon.hello.dao;
import com.esoon.hello.pojo.MongoComment;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
/**
* 备注:操作mongodb数据库方法mongoTemplate都封装好了,不用像mybatis在xml写sql,调用所需方法即可
*/
@Component
public class MongoTestDao {
@Resource
private MongoTemplate mongoTemplate;
public void saveTest(MongoComment mongoComment) {
mongoTemplate.save(mongoComment);
}
public List<MongoComment> findAll() {
Query query = new Query();
List<MongoComment> list = mongoTemplate.findAll(MongoComment.class);
return list;
}
public List<MongoComment> findByName(String name) {
Query query = new Query(Criteria.where("name").is(name));
List<MongoComment> list = mongoTemplate.find(query, MongoComment.class);
return list;
}
public List<MongoComment> updateByName(String name) {
Query query = new Query(Criteria.where("name").is(name));
Update update = new Update().set("name", "jjjjjjack"); //_id是不能更新的
mongoTemplate.updateFirst(query, update, MongoComment.class); //updateFirst更新查询结果集中的第一条
return findAll();
}
public List<MongoComment> deleteById(String id) {
Query query = new Query(Criteria.where("id").is(id));
mongoTemplate.remove(query, MongoComment.class);
return findAll();
}
}
MongoDB Compass查询效果:
网页查询效果: