使用场景
- 用于价值较低的数据,对事务性要求不高,例如:视频的评论点赞互动信息、数据下行日志数据,但是对于财务类系统最好使用关系型数据库;
- 灵活的数据模型,由于数据字段采用JSON形式,业务字段多变的场景,推荐使用MongoDB;
- 大数据量、高性能,由于数据结构简单,在大数据量下具有很好的读写性能,为互联网三高项目使用;
- 相比关系型数据库,具有更好的扩展性;
与Mysql数据库对比
比较点 | MongoDB | MySQL |
---|---|---|
数据库类型 | 文档型数据库,存储的是文档型数据(JSON格式) | 关系型数据库,存储结构化数据 |
数据模式 | 动态模式,同一集合文档不需要有相同字段和结构 | 需要预先定义字段 |
查询语言 | 面向文档查询语言,可以对JSON格式的数据进行查询 | 使用SQL语言查询数据库 |
索引 | 可以对任何属性建立索引 | 对表中的列建立索引 |
扩展性 | 方便扩展到大数据量和高并发 | 虽然也可以扩展,但需要更多的工作 |
延迟性 | 写入操作低 | 相对高 |
事务性 | 在4.2版本中引入分布式事务 | 事务的ACID特性,支持较好 |
windows MonogDB安装
官网下载地址:www.mongodb.com/try/downloa... 这里安装的是企业版,如果是单纯学习使用,建议安装社区版,直接点击下一步进行安装,
如果网速可以,还可以勾选mongodb的图形画工具安装,就不用单独下载连接工具;
点击finish按钮之后,完成安装。
windows MongoDB 相关操作
1、配置环境变量:系统属性-高级-环境变量-path系统变量中,把MongoDB的bin路径,配置到环境变量; 2、删除MongoDB服务 : sc delete MongoDB ; 3、安装MongoDB服务:mongod --dbpath=F:\mongodb\data\db --logpath=F:\mongodb\log\MongoDB.log --install --serviceName "MongoDB" ; 4、启动服务:net start MongoDB,关闭服务:net stop MongoDB; 5、mongod -version 查看mongodb版本;
6、mongodb 开启账号密码认证,只需要编辑文件D:\Program Files\MongoDB\bin\mongod.cfg,如下所示,编辑完成之后,记得重启MongoDB服务。
yaml
#注意这里的语法,要遵循spring boot中的yaml语法
security:
authorization: enabled
NoSQLBooster for MongoDB 破解
NoSQLBooster 基于 Electron 编写, 并且使用 asar 打包(Ref-1),所以我们能够解压 NoSQLBooster 安装目录下.asar格式的包文件,并修改代码重新打包替换掉原来的包文件 1、安装打包和解压工具,由于npm访问较慢,可以通过指定阿里镜像,提升安装速度;
ini
npm install asar -g --registry=http://registry.npm.taobao.org
2、解压包文件 打开任务管理器,找到 NoSQLBooster 进程,选中任一个子进程,右键打开文件所在位置,找到安装根目录。进入resources目录, 解压app.asar文件;
执行命令:
asar extract app.asar app
3、修改 app\shared\lmCore.js, 延长试用期 找到上述文件,搜索关键字MAX_TRIAL_DAYS 修改控制试用天数的常量
ini
const MAX_TRIAL_DAYS=150; //比如改成3600
const TRIAL_DAYS=30; //同样改成3600
4、重新打包、删除app文件
perl
asar pack app app.asar
5、禁用自动更新 找到resources\app-update.yml,任意修改url, 使得自动更新不能请求到该地址,修改
rust
url: 'http://s3.mongobooster.com/download/releasesv7/404'
偶然发现了自动更新目录,也删除一下
bash
C:\Users\XXXXX\AppData\Local\Programs\nosqlbooster4mongo\resources>cd ../../../
C:\Users\XXXXX\AppData\Local>cd nosqlbooster4mongo-updater
C:\Users\XXXXX\AppData\Local\nosqlbooster4mongo-updater>dir /b
installer.exe
C:\Users\XXXXX\AppData\Local\nosqlbooster4mongo-updater>cd ../
C:\Users\XXXXX\AppData\Local>rmdir /S /Q nosqlbooster4mongo-updater
###### MongoDB 资料链接
1、csdn技术文档 https://blog.csdn.net/yuan2019035055/article/details/123031732
2、MongoDB中文手册 https://docs.mongoing.com/aggregation/aggregation-pipeline
3、Spring官网 API https://docs.spring.io/spring-data/mongodb/docs/current/api/org/springframework/data/mongodb/core/query/package-summary.html
###### 与Spring项目集成
1、pom文件中引入Maven依赖
<!--引入Spring mongodb依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
2、application.yaml文件添加MongoDB数据库链接配置
yaml
spring:
#Spring 添加mongodb连接配置
data:
mongodb:
database: test
uri: mongodb://admin:123456@localhost:27017
3、代码示例demo:
- 新建实体类,通过@Document(collection = "person")注解标记为mongodb的collection
arduino
package com.zhc.model.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import org.springframework.data.mongodb.core.mapping.Document;
/**
*
* @author zhouhengchao
* @since 2024-03-01 15:29:00
*/
@Document(collection = "person")
@Data
@AllArgsConstructor
public class Person {
/**
* 主键id
*/
private Long id;
/**
* 用户名
*/
private String userName;
/**
* 密码
*/
private String passWord;
/**
* 性别
*/
private String gender;
/**
* 年龄
*/
private Integer age;
/**
* 所在城市
*/
private String cityName;
}
- 示例代码,通过junit单元测试介绍MongoDB的CRUD实现
ini
package com.zhc.demo;
import com.alibaba.fastjson.JSON;
import com.google.common.collect.Lists;
import com.zhc.model.entity.Person;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import javax.annotation.Resource;
import java.util.List;
/**
* 1、日常开发中,可能大家会使用到MongoDB数据库;
* 2、工作中一般都是在
*
* @author zhouhengchao
* @since 2024-03-01 10:35:00
* @version 1.0
*/
@SpringBootTest
@Slf4j
public class MongoDBTest {
@Resource
private MongoTemplate mongoTemplate;
/**
* 初始化Collection数据
*/
@Test
void initCollection(){
log.info("初始化collection数据-开始");
Person person1 = new Person(1L,"小王","123456","男",18,"重庆");
Person person2 = new Person(2L,"小丽","23456","女",20,"吕梁");
Person person3 = new Person(3L,"小军","34567","男",30,"大同");
Person person4 = new Person(4L,"小红","45678","女",19,"晋中");
Person person5 = new Person(5L,"小花","13421","女",28,"太原");
List<Person> personList = Lists.newArrayList(person1,person2, person3, person4, person5);
mongoTemplate.insertAll(personList);
log.info("初始化collection数据-结束");
}
/**
* 插入一条数据
*/
@Test
void insertOneData(){
// 插入一条数据,使用insert ,id如果不指定,会自动生成一个随机值
Person person = new Person(6L,"小花花","134121","女",28,"孝义");
mongoTemplate.insert(person);
// 插入多条数据,使用insertAll,传入集合
Person person1 = new Person(7L,"小花花1","134121","女",28,"重庆");
Person person2 = new Person(8L,"小花花2","134121","女",28,"济南");
Person person3 = new Person(9L,"小花花3","134121","女",28,"苏州");
List<Person> personList = Lists.newArrayList(person1, person2, person3);
mongoTemplate.insertAll(personList);
}
/**
* 编辑id为6的数据
*/
@Test
void updateData(){
Person personByIdBefore = mongoTemplate.findById(6L, Person.class);
log.info("修改前:personById:{}", JSON.toJSONString(personByIdBefore));
Update update = new Update();
update.set("userName","小花儿");
Query query = new Query();
query.addCriteria(Criteria.where("id").is(6L));
mongoTemplate.updateFirst(query, update, Person.class);
// 按照id查询
Person personByIdAfter = mongoTemplate.findById(6L, Person.class);
log.info("修改后:personById:{}", JSON.toJSONString(personByIdAfter));
}
/**
* 删除指定id的数据
*/
@Test
void delData(){
Query query = new Query(Criteria.where("id").is(5L));
// 数据库中所有满足条件的集合都会删除,如果只是删除某一条,可以在query中添加limit条件
mongoTemplate.remove(query);
// 指定需要删除数据的集合
mongoTemplate.remove(query, Person.class);
}
/**
* 几种查询操作介绍
*/
@Test
void queryData(){
// 1、直接按照id查询
Person personById = mongoTemplate.findById(6L, Person.class);
log.info("personById:{}", JSON.toJSONString(personById));
// 2、按照多条件And查询,查询28岁的女孩
Query query1 = new Query();
query1.addCriteria(Criteria.where("age").is(28));
query1.addCriteria(Criteria.where("gender").is("女"));
List<Person> personList1 = mongoTemplate.find(query1, Person.class);
log.info("查询28岁的女孩:{}", JSON.toJSONString(personList1));
// 3、多条件or操作,查询28岁或者是女孩
Query query2 = new Query();
query2.addCriteria(Criteria.where("age").is(28).orOperator(Criteria.where("gender").is("女")));
List<Person> personList2 = mongoTemplate.find(query2, Person.class);
log.info("查询28岁或者女孩:{}", JSON.toJSONString(personList2));
// 4、分页查询,性别为女孩的
Query query3 = new Query(Criteria.where("gender").is("女"));
PageRequest pageable = PageRequest.of(1, 10);
query3.with(pageable);
Sort sort = Sort.by(Sort.Direction.ASC, "id");
query3.with(sort);
long total = mongoTemplate.count(query3, Person.class);
List<Person> personList3 = mongoTemplate.find(query3, Person.class);
PageImpl<Person> pageResult = new PageImpl<>(personList3, pageable, total);
log.info("分页查询女孩:{}", JSON.toJSONString(pageResult));
}
}