mongodb学习笔记
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统,操作起来比较简单和容易。文件存储格式为BSON(一种JSON的扩展),BSON 支持文档和数组的嵌套。性能比较: Redis > MongoDB > MySQL / Oralce。
·
一、相关概念
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统,操作起来比较简单和容易。文件存储格式为BSON(一种JSON的扩展),BSON 支持文档和数组的嵌套。
- 集合就是 MongoDB 文档组,类似于 RDBMS 中的表格。集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据。
- 文档是一组键值(key-value)对(即 BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。
文档
{"site": "https://www.gorit.cn", "name":"CodingGorit"}
集合
{"site": "https://www.gorit.cn"}
{"site": "https://www.gorit.cn", "name":"CodingGorit"}
{"site": "https://www.gorit.cn", "name":"CodingGorit","age":5}
二、与其他数据库的区别
性能比较: Redis > MongoDB > MySQL / Oralce
- redis所有数据都是放在内存中的,持久化是使用RDB方式或者aof方式。
- mongodb的所有数据实际上是存放在硬盘的,所有要操作的数据通过mmap的方式映射到内存某个区域内。然后,mongodb就在这块区域里面进行数据修改,避免了零碎的硬盘操作。至于mmap上的内容flush到硬盘就是操作系统的事情了,所以,如果,mongodb在内存中修改了数据,然后,mmap数据flush到硬盘之前,系统当机了,就会丢失数据了。
- mysql,无论数据还是索引都存放在硬盘中。到要使用的时候才交换到内存中。能够处理远超过内存总量的数据。
三、应用场景
- 表结构不明确且数据不断变大。MongoDB是非结构化文档数据库,扩展字段很容易且不会影响原有数据。
- 更高的写入负载。MongoDB侧重高数据写入的性能,而非事务安全,适合业务系统中有大量“低价值”数据的场景。
- 数据量很大或者将来会变得很大。Mysql单表数据量达到5-10G时会出现明细的性能降级,需要做数据的水平和垂直拆分、库的拆分完成扩展,MongoDB内建了sharding、很多数据分片的特性,容易水平扩展,比较好的适应大数据量增长的需求。
- 高可用性。自带高可用,自动主从切换(副本集)
不适用的场景
- MongoDB不支持事务操作,需要用到事务的应用建议不用MongoDB。
- MongoDB目前不支持join操作,需要复杂查询的应用也不建议使用MongoDB。
四、常用命令的格式
- 查询
//查看所有文档记录
db.collection_name.find()
// 查询一个文档
db.collection_name.findOne();
// -------------------------条件查询-----------------------
// 条件查询 ==
db.user.find({"name":"Gorit111"}) // where name = "张三" 全匹配
// 条件查询 小于
db.user.find({"age":{$lt:17}}); // where age < 17
// 条件查询 小于或等于
db.user.find({"age":{$lte:20}}); // where age <= 20
// 条件查询 大于
db.user.find({"age":{$gt:16}}); // where age > 10
// 条件查询 大于或等于
db.user.find({"age":{$gte:16}}); // where age >= 16
// 条件查询 不等于
db.user.find({"age":{$ne: 16}})
// --------------------------逻辑查询----------------------
// 逻辑与 and 查询
db.user.find({"age":17},{"id":"1"})
// 逻辑或 or 查询
db.user.find(
{
$or: [
{"age":17},
{"id":"1"}
]
}
)
// 组合查询练习
where age <=20 or (name in ("张三","Gorit111")
db.user.find(
{
"age": {$lte: 20},
$or: [
{
"name": "张三"
},{
"name": "Gorit111"
}]
}
)
//-----------------------------分页查询-----------------
// 分页参数 Limit()
db.collection_name.find().limit(number);
// 查询数据库汇中的三条记录,如果数据库没有指定 limit() ,默认查询所有的数据
db.user.find().limit(3);
// 使用 skip() 跳跃指定数量的数据
// 跳过第一条记录,查询往后的三条记录
db.user.find().limit(3).skip(1);
- 排序
在 MangoDB 中使用 sort() 方法对数据进行排序, sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来制定排序方式。1 表示升序列,-1 表示降序列。
// 根据年龄升序
db.user.find().sort({"age":1})
// 根据年龄降序排列
db.user.find().sort({"age":-1});
- 插入
show dbs; // 查看数据库
use test; // 如果 test 数据库不存在,则创建 test
// 插入一条记录,如果集合不存在,先创建集合,在插入数据
db.user.insert({"id":"1","name":"Gorit","age":16});
// 一次性插入多条记录
db.user.insert({"id":"5","name":"Gorit555","age":16},{"id":"6","name":"Gorit6666","age":18});
// 一次性插入多条
db.user.insertMany([{"id":"4","name":"Gori333","age":16},{"id":"4","name":"Gorit4444","age":18}])
- 更新
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
参数说明:
query : update的查询条件,类似sql update查询内where后面的。
update : update的对象和一些更新的操作符(如,inc…)等,
也可以理解为sql update查询内set后面的。
- 删除文档
// 删除所有数据
db.collection_ name.remove({})
// 删除指定字段的记录
db.collection_name.remove({"id":"1"})
// 删除指定记录的第一条
db.collection_name.remove({"id":"1"},1)
// 新版本删除所有的集合
db.collection_name.deleteMany({})
// 新版本删除多个 status 为 A的
db.collection_name.deleteMany({ status : "A" })
// 新版本删除一个 status 为 D 的集合
db.inventory.deleteOne( { status: "D" } )
三、java连接mongodb
- 编写实体类时,类上面注意标记
@Document(collection = "ks_app_themes")
,表明连接哪张表。 - 在SpringBoot框架中,使用Spring Data MongoDB操作MongoDB。即在service层中,注入MongoTemplate,直接调用API进行增删改查。
更多推荐
已为社区贡献3条内容
所有评论(0)