mongodb学习笔记
创始人
2025-05-29 04:55:22

一、相关概念

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

  1. redis所有数据都是放在内存中的,持久化是使用RDB方式或者aof方式。
  2. mongodb的所有数据实际上是存放在硬盘的,所有要操作的数据通过mmap的方式映射到内存某个区域内。然后,mongodb就在这块区域里面进行数据修改,避免了零碎的硬盘操作。至于mmap上的内容flush到硬盘就是操作系统的事情了,所以,如果,mongodb在内存中修改了数据,然后,mmap数据flush到硬盘之前,系统当机了,就会丢失数据了。
  3. mysql,无论数据还是索引都存放在硬盘中。到要使用的时候才交换到内存中。能够处理远超过内存总量的数据。

三、应用场景

  1. 表结构不明确且数据不断变大。MongoDB是非结构化文档数据库,扩展字段很容易且不会影响原有数据。
  2. 更高的写入负载。MongoDB侧重高数据写入的性能,而非事务安全,适合业务系统中有大量“低价值”数据的场景。
  3. 数据量很大或者将来会变得很大。Mysql单表数据量达到5-10G时会出现明细的性能降级,需要做数据的水平和垂直拆分、库的拆分完成扩展,MongoDB内建了sharding、很多数据分片的特性,容易水平扩展,比较好的适应大数据量增长的需求。
  4. 高可用性。自带高可用,自动主从切换(副本集)

不适用的场景

  1. MongoDB不支持事务操作,需要用到事务的应用建议不用MongoDB。
  2. MongoDB目前不支持join操作,需要复杂查询的应用也不建议使用MongoDB。

四、常用命令的格式

  1. 查询
//查看所有文档记录
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);
  1. 排序
    在 MangoDB 中使用 sort() 方法对数据进行排序, sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来制定排序方式。1 表示升序列,-1 表示降序列。
// 根据年龄升序
db.user.find().sort({"age":1})// 根据年龄降序排列
db.user.find().sort({"age":-1});
  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}])
  1. 更新
db.collection.update(,,{upsert: ,multi: ,writeConcern: }
)参数说明:
query : update的查询条件,类似sql update查询内where后面的。
update : update的对象和一些更新的操作符(如,inc…)等,也可以理解为sql update查询内set后面的。
  1. 删除文档
// 删除所有数据
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

  1. 编写实体类时,类上面注意标记@Document(collection = "ks_app_themes"),表明连接哪张表。
  2. 在SpringBoot框架中,使用Spring Data MongoDB操作MongoDB。即在service层中,注入MongoTemplate,直接调用API进行增删改查。

相关内容

热门资讯

八方淘金APP现货订购变“非法...   警惕!八方淘金APP被指非法期货陷阱,投资者巨额亏损如何维权?  近期,不少投资者在网络平台上反...
中国白银APP违规经营现货订购...   中国白银软件虚假广告诱导广大投资者去开户充值,投资者根本没有相关交易经验,而这个平台打着现货订购...
新华社权威快报|施行近17年的...   企业国有资产法修订草案4月27日提请十四届全国人大常委会第二十二次会议首次审议。企业国有资产法修...
英特尔业绩超预期,A股芯片“沾... 4月27日,A股芯片板块迎来上涨,帝奥微(688381.SH)、华兴源创(688001.SH)、欧莱...
文旅部“重拳”整治旅游市场乱象... 4月27日,文化和旅游部举办2026年第一季度例行新闻发布会,介绍旅游市场强迫购物整治工作开展情况。...