一、相关概念

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(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>
   }
)

参数说明:
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进行增删改查。
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐