MongoDB
# 介绍
用户的搜索记录,需要给每一个用户都保存一份,数据量较大,要求加载速度快,通常这样的数据存储到mongodb更合适,不建议直接存储到关系型数据库中。
适合存储在MongoDB的数据:
1)海量数据
2)读写高频
3)价值相对低
电商网站数据价值比较高! 订单 ,用户数据,商品数据 丢失后果很严重!存储MySQL
资讯APP价值比较! 文章,用户,自媒体用户,素材
1)用户历史记录(搜索记录)
2)商品的评论
3)系统的公告信息
4)社交App的说说(朋友圈)
MongoDB特点:
- 支持文本查询
- 不需要支持事务,不存在复杂的多表查询
- 存储数据可持久化
- 需要TB甚至 PB 级别数据存储
- 需求变化较快,数据模型无法确认,预计使用快速迭代开发形式
- 需要至少2000以上的读写QPS【高性能】
- 能支持快速水平扩展【高扩展】
- 99.999%高可用【高可用】
# Linux启动MongoDB
1)拉取镜像
docker pull mongo
1
2)创建容器
docker run -di --name mongo -p 27017:27017 -v ~/data/mongodata:/data mongo
1
# Spring整合MongoDB
导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
1
2
3
4
2
3
4
配置yml
spring:
data:
mongodb:
host: 192.168.66.133
port: 27017
database: leadnews-search
1
2
3
4
5
6
2
3
4
5
6
demo
@RunWith(SpringRunner.class)
@SpringBootTest(classes = SearchApplication.class)
public class MongoDBTest {
@Autowired
private MongoTemplate mongoTemplate;
/**
* 保存数据
*/
@Test
public void testSave(){
Random random = new Random();
for(int i=1;i<=5;i++){
ApUserSearch userSearch = new ApUserSearch();
userSearch.setKeyword("黑马"+i);
userSearch.setCreatedTime(DateTime.now().minusMinutes(random.nextInt(10)).toDate());
userSearch.setUserId(1002);
//mongoTemplate.insert(userSearch); //只能用于新增数据
mongoTemplate.save(userSearch);//既可以新增数据,也可以更新数据(存储主键值时)
}
}
/**
* 查询数据
*/
@Test
public void testQuery(){
//单个条件
//Query query = Query.query(Criteria.where("keyword").is("黑马5"));
//多个条件 查询userId=1002,且keyword内容以"头条"开头的
/**
* regex(): 利用正则表达式
*/
//Query query = Query.query(Criteria.where("userId").is(1002).and("keyword").regex("^头条.*"));
//排序查询
/* Query query = Query.query(Criteria.where("userId").is(1002).and("keyword").regex("^头条.*"));
query.with(Sort.by(Sort.Direction.ASC,"createdTime"));//排序*/
//分页显示
Query query = Query.query(Criteria.where("userId").is(1002));
/**
* 参数一:页码,从0开始计算
* 参数二:页面大小
*/
//query.with(PageRequest.of(1,5));
query.limit(5);//页面大小
/**
* find(): 可以将多条结果返回
*/
List<ApUserSearch> searchList = mongoTemplate.find(query, ApUserSearch.class);
searchList.forEach(System.out::println);
/**
* findOne(): 只能返回一条结果
*/
//ApUserSearch userSearch = mongoTemplate.findOne(query, ApUserSearch.class);
}
/**
* 删除数据
*/
@Test
public void testRemove(){
//Query query = Query.query(Criteria.where("_id").is("625e17179c850748db466ee4"));
Query query = Query.query(Criteria.where("userId").is(1003));
mongoTemplate.remove(query,ApUserSearch.class);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
上次更新: 2023/12/29 11:32:56