MongoDB
以JSON为数据模型的文档非关系型数据库
垂直扩展
在一个机器上进行性能扩展
水平扩展
多个机器的扩展
定位特点
定位为应用数据库,
存储数据特点:量大/非敏感/一定的查询性能
MongoDB的语法是JavaScript
语法
添加
db.集合名.insert(js对象)
编辑
db.集合名.updateMany(
<query>{key:value}
<update>{$set:{key:value}}
)
删除
db.集合名.deleteMany(
<query>{key:value}
)
查询
db.集合名.find(
query{key:value}
projection{key:value}(除了_id以外,其他属性,要么全是1,要么全是0)
)
排序
1:正序 2:倒序
sort({列1 : 1})
分页
db.集合.find({}).skip(n).limit(m)
每页显示m条
显示第n条数据开始
比较运算符
语法 ->db.集合名. find( { 字段: {比较操作符: 值, ...} } )
>大于 - $gt greate than < 小于 - $lt less = 大于等于 - $gte equals <= 小于等于 - $lte != 不等 - $ne
is null {$exists: false} in {$in: [xx, xx ...]}
逻辑运算符
语法 -> find( {逻辑操作符: [条件1, 条件2, ...]} ) && 与 - $and || 或 - $or ! 非 - $not
模糊查询
db.集合.find( { 列: {$regex: /关键字/} } ) //sql: select * from user where name like '%关键字%'
db.集合.find({列: {$regex: /关键字/}}) / / 表示正则对象(js) db.集合.find({列: {$regex: "关键字"}})
{name:/xxx/} --->%xxx% {name:/^xxx/} --->xxx% {name:/xxx$/} --->%xxx {name:/xxx/i} 忽略大小写
集成springboot
依赖
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.3</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> <!--spring boot data mongodb--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> </dependencies>
配置
# application.properties # 配置数据库连接 #格式: mongodb://账号:密码@ip:端口/数据库?认证数据库 #spring.data.mongodb.uri=mongodb://root:admin@localhost/mongodemo?authSource=admin spring.data.mongodb.uri=mongodb://localhost/mongodemo # 配置MongoTemplate的执行日志 logging.level.org.springframework.data.mongodb.core=debug
domain
@AllArgsConstructor @NoArgsConstructor @Setter @Getter @ToString @Document("users") //设置文档所在的集合 public class User { //文档的id使用ObjectId类型来封装,并且贴上@Id注解, // 自动映射为_id 自动封装ObjectId @Id private String id; private String name; private Integer age; private List<String> hobby = new ArrayList<>(); }
持久层
自定义持久层操作接口;
1>自定义接口继承MongoRepository接口
2>明确指定2个泛型:
1:当前接口操作实体类:User
2:当前接口操作实体类主键的类型: id---String
业务层
类似mybatis
MongoDB必须是复制集模式才可以使用事务,否则报错
@Service public class UserServiceImpl implements IUserService{ @Autowired private UserRepository userRepository; @Override public void save(User user) { userRepository.save(user); } @Override public void delete(String id) { userRepository.deleteById(id); } @Override public void update(User user) { userRepository.save(user); } @Override public User get(String id) { return userRepository.findById(id).get(); } @Override public List<User> list() { return userRepository.findAll(); } }
分页查询
@Autowired private MongoTemplate mongoTemplate; // 分页查询文档,显示第2页,每页显示3个,按照id升序排列 @Test public void testQuery1() throws Exception { // 创建查询对象 Query query = new Query(); // 设置分页信息 query.skip(3).limit(3); // 设置排序规则 query.with(Sort.by(Sort.Direction.ASC,"id")); List<User> list = mongoTemplate.find(query, User.class, "users"); list.forEach(System.err::println); }
高级查询
使用MongoTemplate
@Test public void testQuery2() throws Exception { // 构建限制条件 {"name": "dafei"} Criteria criteria = Criteria.where("name").is("dafei"); // 创建查询对象 Query query = new Query(); // 添加限制条件 query.addCriteria(criteria); List<User> list = mongoTemplate.find(query, User.class, "users"); list.forEach(System.err::println); }
JPA查询规范
前缀+ 操作符 + 属性名/列名
前缀: find / query
操作符: by and or lessThan
属性名/列名