写在前面:
MongoDb之前项目中接触到过,那时啥都不懂,回去看教程琢磨了半天好不容易才安装好了服务,对它都还是一知半解的状态。什么文档型数据库什么查询快速什么nosql都是对它片面的评价,还没有真正认识它了解它。现在借此机会,来看看它到底能干什么。
首先,MongoDB是文档型(Document store)的NoSQL数据库,数据以文档(对应关系型数据库的记录,本文有时候会混用)的形式在MongoDB中保存,文档实际上就是一个个JSON字符串。使用JSON的好处是非常直观,通过一系列的Key-Value键值对来表示数据。Value可以是普通的整型、字符串,可以是数组,也可以是嵌套的子文档,使用嵌套的好处是在MongoDB中仅需一次简单的查询就能够获取到你所需的数据。
举电商领域为例,网易严选上卖的上衣和裤子两种商品,除了有共同属性,如产地、价格、材质、颜色等外,还有各自有不同的属性集,如上衣的独有属性是肩宽、胸围、袖长等,裤子的独有属性是臀围、脚口和裤长等。这些独有属性可以直接以JSON子文档的方式嵌套在商品这个文档中,一次查询直接获取全部内容,不需要进行多表join;MongoDB文档的另一大特点是模式灵活:不同文档相同key的value类型可以是整形也可以是字符串等其他类型,不同文档可以有不同的key,比如有些商品有折扣字段,可以定义不同会员等级的不同折扣。在电商配套的物流领域,可以将一个快递的物流信息直接嵌套在以商品id为唯一索引的文档中,一次查询就可以获取完整的快递流向信息。
安装:
1.登录MongoDb官网选择相对应的版本 64位*64 安装包为MSI格式的
https://www.mongodb.com/download-center/community
2.安装过程中,可以通过点击 "Custom(自定义)" 按钮来设置你的安装目录。我安装在了E盘mongodb目录下。
3.下一步安装 "install mongoDB compass" 不勾选(当然你也可以选择安装它,可能需要更久的安装时间),MongoDb Compass 是一个图形界面管理工具。(类似于数据库图形化管理工具navicat)后面我用的是Studio 3T来管理MongoDb。
4. 安装完成后在E:\mongodb\data中创建数据目录和日志目录。为的就是后面配置MongoDb服务,省的以后每次通过命令行来启动服务。
5.打开MongoDb自带的mongod.cfg配置文件。去更改里面默认的数据目录和日志目录地址。换成上面自己新建的数据和日志目录。
6.管理员模式打开命令行窗口(C:),进入到bin目录下。把上面的配置文件进行服务安装
mongod.exe --config "E:\mongodb\bin\mongod.cfg"--install
7.打开任务管理器,选择MongoDb。可以看到 服务启动命令已经换成了上面配置的命令了。点击启动,即可启动我们的MongoDb服务。
8.打开cmd命令行窗口,输入mongo,,即可看到连接服务器成功。
基本概念
SQL术语 | MongoDb术语 | 含义 |
Database | Database | 数据库 |
Table | Collection | 数据库表/集合 |
Row | document | 行/文档 |
Column | Field | 字段/域 |
Table join | / | 表连接/mongo不支持 |
Primary key | Primary key | 主键/mongo以_id为主键 |
常用命令
展示所有数据库
show dbs
显示当前数据库
db
显示所有集合
show collections
使用当前数据库
use MyTestDB
插入:向table01集合(数据表)中插入name、age、qq信息
db. table01.insert({name:"FFF",age:22,qq:"qqq"})
插入:可以自行指定_id,但长度要达到48位
db.table01.insert({_id:ObjectId("123456789987654321000012"),name:"天天"})
查找指定
db. table01.findOne({qq:"qqq"})
查找所有
db. table01.find({})
替换成(就剩age)
db. table01.update({name:"CCC"},{age:18})
替换为name:"向上",age:99
db.table01.update({name:"天天"},{name:"向上",age:99})
新增字段 $set (新增name和age字段)
db. table01.update({qq:"qqq"},{$set:{name:"FFF",age:22}})
删除字段 $unset(删除name字段)
db. table01.update({qq:"qqq"},{$unset:{name:1}})
自增 $inc(在原来基础上再加500)
db.table01.update({_id:ObjectId("123456789987654321000012")},{$inc:{salart:500}})
删除记录
db.table01.deleteMany ({qq:"qqq"})
清空集合
db.table01.remove({})
删除一个集合(数据库也没了)
db.table01.drop()
大于40
db.table01.find({age:{$gt:40}})
小于50
db.table01.find({age:{$lt:40}})
大于40 小于 50
db.table01.find({age:{$gt:40,$lt:50}})
跳过前2条显示2条
db.table01.find({}).skip(2).limit(2)
排序 1:正序 -1:倒叙
db.table01.find().sort({age:-1})
在项目中操作MongoDb
配置pom和yml
<!--mongodb-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
spring:
data:
mongodb:
uri: mongodb://127.0.0.1:27017/MongoDbTest
主要用到了SpringBoot给我们提供的MongoTemplate类似JPA和MybatisPlus给我们提供的
一个模板,方便我们进行增删改查。
@Autowired
private MongoTemplate mongoTemplate;
增
@ApiOperation(value = "新增用户",notes = "新增100个用户")
@PostMapping("/add")
public WebResponse add() {
List<SysUser> userList = new ArrayList<>();
SysUser sysUser = null;
for (int i = 1; i <=100 ; i++) {
sysUser = new SysUser();
sysUser.setId(i);
sysUser.setUserName("ys"+i);
sysUser.setCreateTime(new Date());
sysUser.setDelFlag(0);
sysUser.setStatus(1);
userList.add(sysUser);
mongoTemplate.insert(sysUser);
}
return WebResponse.resSuccess("新增成功",userList.size());
}
删
@ApiOperation(value = "删除语句",notes = "根据_id来删除")
@ApiImplicitParam(name = "id",value = "id值",required = true,dataType = "int")
@DeleteMapping("/delete")
public WebResponse delete(Integer id){
//查询
Query query = new Query();
//条件
Criteria criteria = new Criteria();
criteria.and("_id").is(id);
query.addCriteria(criteria);
DeleteResult deleteResult = mongoTemplate.remove(query,SysUser.class);
return WebResponse.resSuccess("删除成功",deleteResult.getDeletedCount());
}
改
@ApiOperation(value = "修改用户信息",notes = "根据_id和userName来修改userName")
@ApiImplicitParams({
@ApiImplicitParam(name = "id",value = "id值",required = true,dataType = "int"),
@ApiImplicitParam(name = "userName",value = "userName",required = true,dataType = "String"),
})
@PutMapping("/update")
public WebResponse update(Integer id,String userName){
//查询
Query query = new Query();
//条件
Criteria criteria = new Criteria();
criteria.and("_id").is(id);
query.addCriteria(criteria);
Update update = new Update();
update.set("userName",userName);
//新增了一个字段newziduan
update.set("newziduan","hahhaha");
UpdateResult updateResult = mongoTemplate.updateMulti(query, update, SysUser.class);
return WebResponse.resSuccess("修改成功",updateResult.getModifiedCount());
}
查
@ApiOperation(value = "查询列表",notes = "根据条件来查询列表")
@ApiImplicitParams({
@ApiImplicitParam(name = "userName",value = "名字",required = false,dataType = "String")
})
@GetMapping("/list")
public WebResponse list(String userName){
//查询
Query query = new Query();
//条件
Criteria criteria = new Criteria();
//姓名 模糊查询
Pattern pattern = null;
if(!StringUtils.isEmpty(userName)){
//用正则匹配进行模糊查询
pattern = Pattern.compile("^.*" + userName + ".*$", Pattern.CASE_INSENSITIVE);
criteria.and("userName").regex(pattern);
}
query.addCriteria(criteria);
//统计查询总条数
long count = mongoTemplate.count(query, SysUser.class);
System.out.println("统计查询总条数"+count);
return WebResponse.resSuccess("查询成功",mongoTemplate.find(query, SysUser.class));
}
Nice~