MongoDB的文档与springboot集成操作

MongoDB的概念:

可扩展、高性能的 NoSQL 数据库,解决 web 应用提供高性能可扩展的数据存储的方案。

特点是高性能、易部署、易使用,存储数据(bson),主要特性有:

  • 模式自由,支持动态查询、完全索引,可轻易查询文档中内嵌的对象及数组。
  • 面向集合存储,易存储对象类型的数据 , 包括文档内嵌对象及数组。
  • 高效的数据存储 , 支持二进制数据。
  • 支持复制和故障恢复;提供了 主-从、主-主模式的数据复制及服务器之间的数据复制。
  • 自动分片以支持云级别的伸缩性,支持水平的数据库集群,可动态添加额外的服务器。
MongoDB 优点:
  1. 性能优越:快速!在适量级的内存的 MongoDB 的性能是非常迅速的,它将热数据存储在物理内存中,使得热数据的读写变得十分快,
  2. 高扩展:第三方支持丰富(这是与其他的 No SQL 相比,MongoDB 也具有的优势)
  3. 自身的 Failover 机制!
  4. 弱一致性,能保证用户的访问速度
  5. 文档结构的存储方式,能够更便捷的获取数据: json 的存储格式
  6. 支持大容量的存储,内置 GridFS
  7. 内置 Sharding
MongoDB 缺点:

① MongoDB 不支持事务操作(最主要的缺点)
② MongoDB 占用空间过大(如果是大数据则提高性能需要以牺牲大量空间为代价)
③ MongoDB 没有如 MySQL 那样成熟的维护工具,这对于开发和IT运营都是个值得注意的地方(不支持复杂的sql)
**注意:**MongoDB 有一个最大的缺点,就是它占用的空间很大,因为它属于典型空间换时间原则的类型。那么它的磁盘空间比普通数据库会浪费一些,而且到目前为止它还没有实现在线压缩功能,在 MongoDB 中频繁的进行数据增删改时,如果记录变了,例如数据大小发生了变化,这时候容易产生一些数据碎片,出现碎片引发的结果,一个是索引会出现性能问题。
另外一个就是在一定的时间后,所占空间会莫明其妙地增大,所以要定期把数据库做修复,定期重新做索引,这样会提升MongoDB 的稳定性和效率。

@Document(“MongoDB库里的集合”) 的作用

//设置文档所在的集合

Redis、MongoDB、MySQL三者性能与数据量区别

数据量和性能的比较:
当物理内存够用的时候,Redis > MongoDB > MySQL
当物理内存不够用的时候,Redis 和 MongoDB 都会使用虚拟内存。
实际上如果Redis要开始虚拟内存,那很明显要么加内存条,要么你就该换个数据库了。
但是,MongoDB 不一样,只要,业务上能保证,冷热数据的读写比,使得热数据在物理内存中,mmap 的交换较少。
MongoDB 还是能够保证性能。有人使用 MongoDB 存储了上T的数据。
MySQL,MySQL根本就不需要担心数据量跟内存下的关系。不过,内存的量跟热数据的关系会极大地影响性能表现。
当物理内存和虚拟内存都不够用的时候,估计除了 MySQL 你没什么好选择了。
其实,从数据存储原理来看,我更倾向于将 MongoDB 归类为硬盘数据库,但是使用了 mmap 作为加速的手段而已。

MongoDB 与 MySQL 命令对比

传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成。
MongoDB 是由数据库(database)、集合(collection)、文档对象(document)三个层次组成。MongoDB对于关系型数据库里的表,但是集合中没有列、行和关系概念,这体现了模式自由的特点。

Redis 与 MongoDB 内存管理机制

Redis 数据全部存在内存,定期写入磁盘,当内存不够时,可以选择指定的 LRU 算法删除数据。
MongoDB 数据存在内存,由 linux系统 mmap 实现,当内存不够时,只将热点数据放入内存,其他数据存在磁盘。

支持的数据结构
Redis 支持的数据结构丰富,包括hash、set、list等。
MongoDB 数据结构比较单一,但是支持丰富的数据表达,索引,最类似关系型数据库,支持的查询语言非常丰富。

性能
二者性能都比较高,应该说都不会是瓶颈。

可靠性
二者均支持持久化。

集群
MongoDB 集群技术比较成熟,Redis从3.0开始支持集群。

适用的场景

  • 评论系统
  • 快递系统
  • 游戏系统
  • 日志系统

不适用的场景

  • 需要使用复杂sql的操作
  • 事务性系统
MongoDB文档操作

控制台操作

/*
进入控制台运行sell命令

连接服务器: mongo  ip:port     
mongo  localhost:27017

显示当前使用的数据库: 
db

切换数据库: use  数据库名
use test

创建数据库
MongoDB没有专门的创建数据库的命令, 可以使用use 来选择某个数据库, 如果库不存在, 将会创建,但是只有往该库加入文档后才保存成文件

删除数据库:
db.dropDatabase();    //删除当前所在数据库

显示某个数据库的集合
show collections   或者   show tables

创建集合
MongoDB中,不用创建集合, 因为没有固定的结构, 直接使用db.集合名称.命令 来操作就可以了, 如果非要显示创建的话
使用: db.createCollection("集合名称")
*/

添加
document:类似json格式数据 {数据1:参数1,数据2:参数2,…}
document:类似json格式数据 [{数据1:参数1,数据2:参数2,…},{数据1:参数1,数据2:参数2,…},…]
document:表示保存到文档中去
options:可选择对应的要显示的集合元素,除了_id可任意选择 是0还是1之外,其余的要么全0要么全1,要么不输入则不显示。1表示要显示的,0表示不要显示的

db.集合名.insert(document, options)

添加或保存
document:类似json格式数据 {数据1:参数1,数据2:参数2,…}
document:类似json格式数据 [{数据1:参数1,数据2:参数2,…},{数据1:参数1,数据2:参数2,…},…]
document:表示保存到文档中去
options:可选择对应的要显示的集合元素,除了_id可任意选择 是0还是1之外,其余的要么全0要么全1,要么不输入则不显示。1表示要显示的,0表示不要显示的

//没有_id则进行添加,有__id则进行修改

db.集合名.save(document, options)

修改

filter:过滤条件
update:要进行修改的值
options:进行聚合操作

# 一次修改
db.users.updateOne(filter, update, options)
# 多次修改
db.users.updateMany(filter, update, options)

例子

一次只更新首条
db.users.updateOne({name:"xiaoming"}, {$set:{name:"xiaowu"}})
一次更新多个
db.users.updateMany(
{age:{ $lte: 20 }},
{$set:{name:"xiaoming",age:12}}
)

删除

filter:过滤条件

options:进行聚合操作

一次删除一条
db.users.deleteOne(filter, options)
一次删除多条
db.users.deleteMany(filter, options)
MongoDB查询操作

query:查询的过滤条件

projection:从document中查找特定的key/value pair,类似于关系型DB的where子句和select子句(主要显示类似sql那样指定的字段)

/*
{ xxx: <value>, field2: <value> ... }

MongoDB各条件查询格式

/*
“>”,“>=”,“<”,“<=”,"=","neq" 分别使用 gt,gt,gte,lt、lte、eq、neq 表示,格式是
{ xxx: { $lt: value} }
{ xxx: { $gt: value} }
{ xxx: { $lte: value} }
{ xxx: { $gte: value} }
{ xxx: { $eq: value} }
{ xxx: { $neq: value} }
逻辑或算符使用 $or 表示,格式是
{ $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }
逻辑与运算符使用“,” ,或者$and 表示,格式是
{ $and: [ { <expression1> }, { <expression2> } , ... , { <expressionN> } ] }
在范围内查询,使用 in表示,不在范围内,使用nin表示,格式是
{ xxx: { $in: [<value1>, <value2>, ... <valueN> ] } }
{ xxx: { $nin: [<value1>, <value2>, ... <valueN> ] } }

db.users.find({}).sort({xxx:1})  //正序
db.users.find({}).sort({xxx:-1})  //倒序
db.users.find({}).sort({xxx1:-1, xxx2:1})  //多列排序
//分页查询
db.users.find().skip(0).limit(3)    //第一页
db.users.find().skip(3).limit(3)    //第二页
db.users.find().skip((currentPage-1) * pageSize).limit(pageSize)
//模糊查询
//相当于 列 like '%关键字%'
db.集合.find(   {   列: {$regex: /关键字/}  }   )
//格式
{列:/xxx/}     --->%xxx%
{列:/^xxx/}	 --->xxx%
{列:/xxx$/}	 --->%xxx
{列:/xxx/i}   忽略大小写

详细去官网看
https://docs.mongodb.com/manual/reference/operator/query/
db.users.find(query, projection)

//多重条件模糊例子

//查name中包含fei字样,并且年龄在28 到 30间的用户信息,
//sql:  select * from users where name like '%fei%' and age >= 28 and age <=30
db.users.find(
   {$and: [{name: {$regex:/fei/}}, {age: {$gte:28, $lte:30}}]}
)
MongoDB文档设计

MongoDB的文档模式存储单位是一个文档,可以支持数组和嵌套文档,所以很多时候直接用一个这样的文档就可以涵盖这个客户相关的所有个人信息。

一般建议的是先考虑内嵌, 直接按照你的对象模型来设计你的数据模型。如果你的对象模型数量不多,关系不是很复杂,可能直接一种对象对应一个集合就可以了。

内嵌是文档模型的特色,可以充分利用MongoDB的富文档功能来处理一些文档模型的性能和扩展性等特性。一般的一对一、一对多关系,比如说一个人多个地址多个电话等等都可以放在一个文档里用内嵌来完成。

详细:MongoDB 进阶模式设计 | MongoDB中文社区 (mongoing.com)

springboot 操作MongoDB

传统相关的crud操作

@Autowired
private IUserService userService;
//添加
@Test
public void testSave(){
    User user = new User();
    user.setId(String.valueOf(21L));
    user.set_id(String.valueOf(3L));
    user.setName("dafei");
    user.setAge(18);
    userService.save(user);
}
//修改
@Test
public void testUpdate(){
    User user = new User();
    user.set_id("21");
    user.setId("21");
    user.setName("dafei2222");
    user.setAge(18);
    userService.update(user);
}
//删除
@Test
public void testDelete(){

    userService.delete("21");
}
//查询单个
@Test
public void testGet(){
    System.out.println(userService.get("21"));
}
//查询多个
@Test
public void testList(){
    System.out.println(userService.list());
}

根据MongoDB的JPA规范

查询

构建限制条件
Criteria criteria = Criteria.where(“name”).is(“dafei”);
创建查询对象
Query query = new Query();

import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Criteria;

@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"));
    //第一个参数为查询对象集合的过滤条件
    //第二个参数为实体类的字节码对象
    //第三个参数为MongoDB中的集合
    List<User> list = mongoTemplate.find(query, User.class, "users");
    list.forEach(System.err::println);
}

// 查询所有name为dafei的文档
//import org.springframework.data.mongodb.core.query.Criteria;
@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);
}

@Autowired
private MongoTemplate mongoTemplate;

MongoCollection<实体类对象> collection = (MongoCollection<实体类对象>) this.mongoTemplate;

调用这个collection 对象里面的方法和数据库文件操作没有什么区别

SpringBoot集成MongoDB的命名规范例子

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tM2RBdS4-1640834408773)(C:\Users\ljq\Desktop\笔记\mongoDB\6lcd9tjniu7k7pgtlgfovl414c.jpg)]

query.with()等价于limit查询

1.了解Spring 2.了解NoSQL文档数据库 3.要求 4.其他帮助资源 4.1。支持 4.1.1。社区论坛 4.1.2。专业支持 4.2。发展之后 5.新&值得注意的 5.1。Spring Data MongoDB 2.1中的新特性 5.2。Spring Data MongoDB 2.0中的新特性 5.3。Spring Data MongoDB 1.10中的新特性 5.4。Spring Data MongoDB 1.9中的新特性 5.5。Spring Data MongoDB 1.8中的新特性 5.6。Spring Data MongoDB 1.7中有什么新功能 6.依赖 6.1。Spring Boot的依赖管理 6.2。Spring框架 7.使用Spring Data Repositories 7.1。核心概念 7.2。查询方法 7.3。定义存储库接口 7.3.1。微调储存库定义 7.3.2。空处理存储库方法 7.3.3。将存储库与多个Spring Data模块一起使用 7.4。定义查询方法 7.4.1。查询查询策略 7.4.2。查询创建 7.4.3。属性表达式 7.4.4。特殊参数处理 7.4.5。限制查询结果 7.4.6。流式查询结果 7.4.7。异步查询结果 7.5。创建存储库实例 7.5.1。XML配置 7.5.2。JavaConfig 7.5.3。独立使用 7.6。Spring Data存储库的自定义实现 7.6.1。定制个人存储库 7.6.2。自定义基础存储库 7.7。从聚合根发布事件 7.8。Spring数据扩展 7.8.1。Querydsl扩展 7.8.2。Web支持 7.8.3。存储库填充程序 7.8.4。传统网络支持 参考文档 8.介绍 8.1。文档结构 9. MongoDB支持 9.1。入门 9.2。示例存储库 9.3。用Spring连接到MongoDB 9.3.1。使用基于Java的元数据注册Mongo实例 9.3.2。使用基于XML的元数据注册Mongo实例 9.3.3。MongoDbFactory接口 9.3.4。使用基于Java的元数据注册MongoDbFactory实例 9.3.5。使用基于XML的元数据注册MongoDbFactory实例 9.4。MongoTemplate简介 9.4.1。实例化MongoTemplate 9.4.2。WriteResultChecking策略 9.4.3。WriteConcern 9.4.4。WriteConcernResolver 9.5。保存,更新和删除文档 9.5.1。如何_id在映射图层中处理该字段 9.5.2。类型映射 9.5.3。保存和插入文件的方法 9.5.4。更新集合中的文档 9.5.5。在集合中插入文档 9.5.6。在集合中查找和插入文档 9.5.7。删除文件的方法 9.5.8。乐观锁定 9.6。查询文件 9.6.1。查询集合中的文档 9.6.2。查询文件的方法 9.6.3。查询不同的值 9.6.4。地理空间查询 9.6.5。GeoJSON支持 9.6.6。全文查询 9.6.7。排序规则 9.6.8。JSON模式 9.6.9。流利的模板API 9.7。按实例查询 9.7.1。介绍 9.7.2。用法 9.7.3。示例匹配器 9.7.4。执行一个例子 9.7.5。无类型示例 9.8。减少地图操作 9.8.1。使用示例 9.9。脚本操作 9.9.1。使用示例 9.10。集团运营 9.10.1。使用示例 9.11。聚合框架支持 9.11.1。基本概念 9.11.2。支持的聚合操作 9.11.3。投影表达式 9.11.4。分面分类 9.12。用自定义转换器覆盖默认映射 9.12.1。使用已注册的Spring Converter进行保存 9.12.2。使用Spring转换器读取 9.12.3。使用MongoConverter注册Spring转换器 9.12.4。转换器消除歧义 9.13。索引和集合管理 9.13.1。创建索引的方法 9.13.2。访问索引信息 9.13.3。使用集合的方法 9.14。执行命令 9.14.1。执行命令的方法 9.15。生命周期事件 9.16。例外翻译 9.17。执行回调 9.18。GridFS支持 9.19。更改流 9.19.1。使用MessageListener更改流 9.19.2。更改流 - 无效 10.反应性的MongoDB支持 10.1。入门 10.2。使用Spring和Reactive Streams Driver连接到MongoDB 10.2.1。使用基于Java的元数据注册MongoClient实例 10.2.2。ReactiveMongoDatabaseFactory接口 10.2.3。使用基于
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值