MongoDB是什么(what)
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。 MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
MongoDB解决什么问题?(why)
想要知道MongoDB解决什么问题,首先应该我们去了解一下MongoDB的发展历史。在现在海量数据的互联网时代,传统的关系型数据库(mysql)已经不能满足高平发、易扩展、高性能的要求,于是Nosql(非关系型数据库)应运而生。关系型数据库要满足ACID原则,而非关系型数据库则弱满足事务,让我们了解CAP定理,BASE原则。
CAP定理(CAP theorem)
在计算机科学中, CAP定理(CAP theorem), 又被称作 布鲁尔定理(Brewer's theorem), 它指出对于一个分布式计算系统来说,不可能同时满足以下三点:
- 一致性(Consistency) (所有节点在同一时间具有相同的数据)
- 可用性(Availability) (保证每个请求不管成功或者失败都有响应)
- 分隔容忍(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)
CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。
因此,根据 CAP 原理将 NoSQL 数据库分成了满足 CA 原则、满足 CP 原则和满足 AP 原则三 大类:
- CA - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。
- CP - 满足一致性,分区容忍性的系统,通常性能不是特别高。
- AP - 满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。
NoSQL的优点/缺点
优点:
-
- 高可扩展性
-
- 分布式计算
-
- 低成本
-
- 架构的灵活性,半结构化数据
-
- 没有复杂的关系
缺点:
-
- 没有标准化
-
- 有限的查询功能(到目前为止)
-
- 最终一致是不直观的程序
BASE
BASE:Basically Available, Soft-state, Eventually Consistent。 由 Eric Brewer 定义。
CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。
BASE是NoSQL数据库通常对可用性及一致性的弱要求原则:
- Basically Available --基本可用
- Soft-state --软状态/柔性事务。 "Soft state" 可以理解为"无连接"的, 而 "Hard state" 是"面向连接"的
- Eventually Consistency -- 最终一致性, 也是 ACID 的最终目的。
ACID vs BASE
| ACID | BASE |
|---|---|
| 原子性(Atomicity) | 基本可用(Basically Available) |
| 一致性(Consistency) | 软状态/柔性事务(Soft state) |
| 隔离性(Isolation) | 最终一致性 (Eventual consistency) |
| 持久性 (Durable) |
MongoDB怎么使用(how)
MongoDB基本概念
MongoDB与mysql对比理解:
| SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
|---|---|---|
| database | database | 数据库 |
| table | collection | 数据库表/集合 |
| row | document | 数据记录行/文档 |
| column | field | 数据字段/域 |
| index | index | 索引 |
| table joins | 表连接,MongoDB不支持 | |
| primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
MongoDB基本命令
数据库的创建与删除
数据库创建: use database_name
如果数据库不存在,则创建数据库,否则切换到指定数据库。
数据库删除: db.dropDatabase() => 对象.方法()
所有数据库查询:show dbs => show databases
显示当前正在使用数据库: db
集合的创建与删除
创建集合
显示创建集合:db.createCollection(name, options)
隐式创建集合:在集合插入文档时,集合不存在会自动创建
例如:db.mycol2.insert({"name" : "菜鸟教程"}) mycol2被隐式创建
集合索引
查看索引: db.collection.getIndexes()
创建索引: db.collection_name.createIndex({ "apId" : 1, "module" : 1})
删除索引: db.collection_name.dropIndex()
删除集合
删除集合: db.collection_name.drop();
文档的CRUD
插入文档
单个文档插入:db.collection_name.insert() 或者 db.c0llection_name.save()
升级版:db.collection_name.insertOne()
- save():如果 _id 主键存在则更新数据,如果不存在就插入数据。该方法新版本中已废弃,可以使用 db.collection.insertOne() 或 db.collection.replaceOne() 来代替。
- insert(): 若插入的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据。
文档批量插入: db.collection_name.insertMany([{},{}])
文档批量插入异常捕做: try { db.collection_name.insertMany() }
catch( e ) { print (e) }
查询文档
查询所有: db.collection_name.find(query,projection)
查询一个: db.collection_name.findOne(query,projection)
- query :可选,使用查询操作符指定查询条件
- projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
AND连接: db.col.find({key1:value1, key2:value2})
db.col.find({"by":"菜鸟教程", "title":"MongoDB 教程"})
OR连接:db.col.find({ $or: [ {key1: value1}, {key2:value2} ] } )
AND与·OR联合使用例子: 相当于where likes>50 AND (by = '菜鸟教程' OR title = 'MongoDB 教程')
=>
db.col.find({"likes": {$gt:50}, $or: [{"by": "菜鸟教程"},{"title": "MongoDB >教程"}]})
type操作符:
如果想获取 "col" 集合中 title 为 String 的数据,你可以使用以下命令:
db.col.find({"title" : {$type : 2}})
或
db.col.find({"title" : {$type : 'string'}})
查询多少个: limit()
db.collection_name.find().limit()
查询最开始跳多是个: skip()
db.collection_name.find().skip()
查询排序:在 MongoDB 中使用 sort() 方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列。 sort()方法基本语法如下所示: db.collection_name.find().sort({KEY:1})
查询集合中一个对象数组里面的属性为某一个值
db.getCollection('order').find({buyList:{$elemMatch: {productId:{$eq: ""}}}})
文档更新
MongoDB 使用 update() 和 save() 方法来更新集合中的文档
update() 方法
update() 方法用于更新已存在的文档。语法格式如下:
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
参数说明:
- query : update的查询条件,类似sql update查询内where后面的。
- update : update的对象和一些更新的操作符(如inc...)等,也可以理解为sql update查询内set后面的
- upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
- multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
- writeConcern :可选,抛出异常的级别。
批量更新: updateMany()
update()默认修改第一条数据 如果修改所有: {multi: true} 或者updateMany()
覆盖更新: db.colllection_name.update({_id: "1"},{name: "miao"})
文档除了name字段其它字段全部没了
局部更新: db.collection_name.update({_id,"1"},{$set: {name: "miao"}})
一个大括号将update内容括起来,然后在前面添加美元符号与set
列值增长 : 比如年龄再原有基础上加1
db.collection_name.update({_id: "1"},{$incr: {age: NumberInt(1)}})
值设置为空 db.collection_name.update({"_id":1},{$unset: {mobile:null}})
db.getCollection('user').update({_id:ObjectId("62ab062a75122d265eb33cda")},{$unset:{mobile:null}})
文档删除
文档删除: db.collection_name.remove(条件)