MongoDB快速入门
1.介绍
Mongodb:是一个nosql的数据库的一种数据库,他是介于关系型数据库与非关系型数据库之间的一种数据库,也可以理解为它是介于Redis与Mysql之间的一种数据库。它是由大数据时代的3V,与互联网需求的三高而产生出来的。
3V:海量Volume ,多样Variety ,实时Velocity
高并发,高可扩,高性能
1.1.Docker安装MongoDB
拉取镜像
docker pull mongo
创建容器
docker run -di --name mongo-service --restart=always -p 27017:27017 -v ~/data/mongodata:/data mongo
2.Mongodb增删改查(CURD)
id 系统会自动加一个
时间戳+机器码 生成
2.1. 增(insert)
新增一条
db.userinfo.insert({name:"贾宝玉",age:25,gander:"男",address:'贾府'})
新增多条
db.userinfo.insert([{name:,address:}
,{name:"林黛玉",age:16,gander:"女",address:'林府'}])
可不可以快速插入10条数据
for(var i=1;i<=10;i++)
{
"clay"+i,age:i})
}
2.2. 查(find)
查询所有的数据
db.集合名称.find({})
查询top条数
db.集合名称.find({}).limit(条数)
条件查询
db.userinfo.find({name:"clay1",age:1},{name:1,_id:0})
分页排序
db.c1.insert({_id:1,name:"a",sex:1,age:1})
db.c1.insert({_id:2,name:,sex:1,age:2})
db.c1.insert({_id:3,name:"b",sex:2,age:3})
db.c1.insert({_id:4,name:"c",sex:2,age:4})
db.c1.insert({_id:5,name:"d",sex:2,age:5})
db.c1.find()
正序
db.c1.find({}).sort({age:1})
降序
db.c1.find({}).sort({age:-1})
分页查询 跳过两条查询两条
db.c1.find({}).sort({age:1}).skip(2).limit(2)
运算符
//年龄大于1
db.c1.find({age:{$gt:1}})
//年龄是 3,4,5的
$in:[3,4,5]}})
2.3. 改(update)
db.集合名.update(条件, 新数据) {修改器: {键:值}}
准备数据
db.c1.insert({name:"8888",age:1,addr:'address',flag:true})
db.c1.update({name:}, {name:"99"})
},
{
$set:{name: "zs44"},
$inc:{age:10},
$rename:{addr:"address"} ,
$unset:{flag:""}
}
)
db.c1.find({name:})
2.4. 删(delete)
//全部移除
db.userinfo.deleteMany({})
db.userinfo.deleteMany({age:1})
3.集成SpringBoot
3.1.搭建
第一:mongo依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
第二:mongo配置
server:
port: 9998
spring:
data:
mongodb:
host: 192.168.200.130
port: 27017
database: leadnews-history
第三:映射
package com.itheima.mongo.pojo;
import lombok.Data;
import org.springframework.data.mongodb.core.mapping.Document;
import java.io.Serializable;
import java.util.Date;
/**
* <p>
* 联想词表
* </p>
*
* @author itheima
*/
@Data
//注:数据库与表的映射
@Document("ap_associate_words")
public class ApAssociateWords implements Serializable {
private static final long serialVersionUID = 1L;
private String id;
/**
* 联想词
*/
private String associateWords;
/**
* 创建时间
*/
private Date createdTime;
}
3.2.基本操作
现在配置好了,那么怎么用那在项目中?
3.2.1.查询
这里有个简单的查询案例:
1).注入MongoTemplate
类
2).查询
// 查询搜索记录
Query query=new Query(Criteria
.where("userId").is(userId)
.and("keyword").is(keyword));
ApUserSearch templateOne = mongoTemplate.findOne(query, ApUserSearch.class);
查询数据库中与传入参数一样的数据,返回结果获取对象
3.2.2.排序
那么,我现在想把查询出来的结果按照创建时间排序,怎么实现那?
1).先把查询条件加上
Query query1 = new Query(Criteria.where("userId").is(userId));
2).接下来用with
来实现将数据排序
query1.with(Sort.by(Sort.Order.desc("createdTime")));
List<ApUserSearch> searches = mongoTemplate.find(query1, ApUserSearch.class);
现在就是按时间进行的逆序排序结果了
3.2.3.替换
现在我想把数据库中的一条记录替换掉,怎么实现?
1).调用 mongoTemplatede 的 findAndReplace
方法
mongoTemplate.findAndReplace(query2,apUserSearch);
注:前面跟的是查询条件,后面跟的是要替换的数据
2).query2的查询条件
Query query2 = Query.query(Criteria
.where("id").is(userSearch.getId()));
注:获取数据库里与传入Id相同的数据
3.2.4.新增
注:如果没有数据会新增,如果存在会覆盖旧数据
mongoTemplate.save(apUserSearch);
3.2.4.模糊匹配
注:这里涉及到正则,详情请参考官方
1).模仿百度搜索
这里可以自己创建一个库,专门用来检索关键字的,最后目的是根据输入框输入的信息,返回给前端一个集合
2).语法
Query query=new Query(
Criteria
.where("associateWords")
.regex("^"+userSearchDto.getSearchWords()+".*"));
注:模糊关键字regex
,该字段 associateWords 与过来的信息进行模糊匹配
3.2.5.分页
模糊查询后,我想加个条件,最多页面显示十条,怎么实现?
1).代码:
query.limit(10);
注:每十条进行分页
2).结果
List<ApAssociateWords> apAssociateWords = mongoTemplate.find(query, ApAssociateWords.class);
注:这样就获取到了模糊匹配的分页集合了
3.2.6.小记
注:这里还有很多方法,回头再研究