MongoDB学习
数据库分类
关系型数据库(RDBMS)
-
关系型数据库遵循ACID规则
-
特性
-
A (Atomicity) 原子性
-
C (Consistency) 一致性
-
I (Isolation) 独立性
-
D(Durability)持久性
-
-
关系型数据库中全是表
-
MySQL 、Oracle、DB2、SQL Server……
非关系型数据库(NO SQL)
-
NoSQL数据库通常对可用性及一致性的弱要求原则为BASE
-
NO SQL – Not Only SQL
-
NO SQL 用于超大规模数据的存储
-
MongoDB 、Redis……
-
键值对数据库
-
文档数据库MongoDB
ACMD VS BASE
ACID | BASE |
---|---|
原子性(Atomicity) | 基本可用(Basically Available) |
一致性(Consistency) | 软状态/柔性事务(Soft state) |
隔离性(Isolation) | 最终一致性 (Eventual consistency) |
持久性 (Durable) |
MongoDB 简介
- MongoDB 是一个开源文档数据库,提供高性能、高可用性和自动扩展的功能。MongoDB 是用 C++ 语言编写的非关系型数据库。
- MongoDB 是为了快速开发互联网Web应用而设计的数据库系统
- MongoDB 的设计目标是极简、灵活、作为Web应用栈的一部分
- MongoDB 的数据模型是面向文档的,所谓文档是一种类似于JSON的结构,简单理解MongoDB 这个数据库中存的是各种各样的JSON。(BSON)
- BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON。
MongoDB 概念解析
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
-
数据库
数据库是一个仓库,在仓库中可以存放多个集合
-
集合
集合类似于数组,在集合中可以存放文档
-
文档
1.文档数据库中的最小单位,存储和操作的内容都是文档
2.在MongoDB中,数据库和文档均不需要手动创建,当我们创建文档时,如果数据库和集合不存在则会自动创建数据库和集合
MongoDB 数据库细化
-
数据库的服务器端
服务器用来保存数据
mongod用来启动服务器
-
数据库的客户端
客户端用来操作服务器
mongo用来启动客户端
MongoDB 基本指令
指令 | 作用 |
---|---|
show dbs | 显示当前的所有数据库 |
show databases | 同 show dbs |
use DATABASES_NAME(数据库名) | 进入到指定的数据库中(如果数据库不存在,则创建数据库,否则切换到指定数据库。) |
db | 显示当前所处的数据库 |
show collections | 显示数据库中所有的集合 |
db.stats() | 统计数据信息 |
删除集合
db.collections.drop()
删除数据库
db.dropDatabase()
MongoDB 插入文档
db..insert()
collections 集合名–如何集合不存在则会自动在当前数据库下创建集合并插入文档
插入一个或多个文档
当插入文档时,若未指定 _id 属性则数据库会自动为文档添加 _id 属性来作为文档的唯一标识
当自己指定 _id 时应保证 _id 的唯一性
语法:
db.collection.insert( <document or array of documents>, { writeConcern: <document>, //可选字段 ordered: <boolean> //可选字段 } )
参数:
参数表示可设置插入一条或多条文档。writeConcern: 参数表示自定义写出错的级别,是一种出错捕捉机制。
ordered: 是可选的,默认为 true。
true,在数组中执行文档的有序插入,并且如果其中一个文档发生错误,MongoDB 将返回而不处理数组中的其余文档;
false,则执行无序插入,若其中一个文档发生错误,则忽略错误,继续处理数组中的其余文档。
//插入一个 db.users.insert({name:"zhangsan",age:"32"}) db.users.find({}) /* * { * "_id" : ObjectId("6013a3cccb67494036ad2a8a"), * "name" : "zhangsan", * "age" : "32" * } */ //插入多个(数据应为数组) db.users.insert([{name:"lisi",age:"35"},{name:"wangwu",age:"23"}]) db.users.find({}) /* * { * "_id" : ObjectId("6013a5fccb67494036ad2a8c"), * "name" : "lisi", * "age" : "35" * } * { * "_id" : ObjectId("6013a5fccb67494036ad2a8d"), * "name" : "wangwu", * "age" : "23" * } */ //将数据定义为变量插入 document = ({ name:"zhaoliu", age:"65" }) db.users.insert(document) db.users.find({}) /* * { * "_id" : ObjectId("6013a904cb67494036ad2a8e"), * "name" : "zhaoliu", * "age" : "65" * } */
3.2 以后新增插入命令,用法同上:
db..insertone()
- 插入单个文档
db..insertmany()
- 插入多个文档
MongoDB 查询文档
db..find()
find()用来查询集合中所有符合条件的文档
参数
{} – 查询所有文档
{属性名:属性值 } – 查询指定值的文档
返回值为一个数组
特定类型查询
- pretty() 方法以格式化的方式来显示所有文档
- limit(number) 方法用于限制查询结果的个数
- skip(number) 方法用于略过指定个数的文档
- sort({排序字段:1}) 用于对查询结果进行排序,1 升序,-1 降序
- count() 用于查询所有结果的数量
投影
- db.collections.find({},{想要显示的字段:1}); //1显示
- db.collections.find({},{想要显示的字段:0}); //0不显示
//查询所有
db.users.find()
/*
* | _id | name | age |
* | :----------------------: | -------- | ---- |
* | 6013ad62cb67494036ad2a93 | zhangsan | 3 |
* | 6013ad63cb67494036ad2a94 | lisi | 35 |
* | 6013ad63cb67494036ad2a95 | wangwu | 23 |
* | 6013ad67cb67494036ad2a96 | zhaoliu | 65 |
*/
//查询lisi
db.users.find({name:"lisi"})
/*
* | 6013ad63cb67494036ad2a94 | lisi | 35 |
*/
3.2 以后新增用法,用法同上
db..findOne()
- 用来查询符合条件的第一个文档
- 返回值是一个文档对象
db.users.findOne({age:"23"}).name //wangwu
查询条件
操作符 | 格式 | 实例 | 与 RDBMS where 语句比较 |
---|---|---|---|
等于(=) | { : {}} | db.test.find( {price : 24} ) | where price = 24 |
大于(>) | { : {$gt : }} | db.test.find( {price : {$gt : 24}} ) | where price > 24 |
小于(<) | { : {$lt : }} | db.test.find( {price : {$lt : 24}} ) | where price < 24 |
大于等于(>=) | { : {$gte : }} | db.test.find( {price : {$gte : 24}} ) | where price >= 24 |
小于等于(<=) | { : {$lte : }} | db.test.find( {price : {$lte : 24}} ) | where price <= 24 |
不等于(!=) | { : {$ne : }} | db.test.find( {price : {$ne : 24}} ) | where price != 24 |
与(and) | {key01 : value01, key02 : value02, …} | db.test.find( {name : “《MongoDB 入门教程》”, price : 24} ) | where name = “《MongoDB 入门教程》” and price = 24 |
或(or) | {$or : [{key01 : value01}, {key02 : value02}, …]} | db.test.find( {$or:[{name : “《MongoDB 入门教程》”},{price : 24}]} ) | where name = “《MongoDB 入门教程》” or price = 24 |
MongoDB 修改(更新)文档
db.collections.update(查询条件,新对象,{
upsert,
multi,
writeConcern,
collation})
update()默认会使用新对象来替换旧对象
默认只会修改一个
修改指定属性
$set 修改文档中的指定属性
$unset 用来删除文档的指定属性
参数
upsert:为布尔型可选项,表示如果不存在 update 的记录,是否插入这个新的文档。true 为插入;默认为 false,不插入。
multi:也是布尔型可选项,默认是 false,只更新找到的第一条记录。如果为 true,则把按条件查询出来的记录全部更新。
writeConcem:表示出错级别。
collation:指定语言。
//用上方案例 //修改 name为zahngsan 的年龄修改为18 db.users.update({name:"zhangsan"},{$set:{age:"18"}}) // | 6013ad62cb67494036ad2a93 | zhangsan | 18 |
3.2 以后新增用法,同上
db.collections.updateOne()
- 修改一个符合条件的文档
db.collections.updateMany()
- 同时修改多个符合条件的文档
MongoDB 删除文档
db.collection.remove(
,
{
justOne: , writeConcern:
}
)
参数
query:必选项,是设置删除的文档的条件。
justOne:布尔型的可选项,默认为false,删除符合条件的所有文档,如果设为 true,则只删除一个文档。
writeConcem:可选项,设置抛出异常的级别。
//用上边案例 //删除name为zhangsan所有的文档 db.users.remove({name:"zhangsan"})
db.collections.deleteOne()
- 删除一个
db.collections.deleteMany()
- 删除全部
MongoDB 文档关系
一对一(One to One)
- 如夫妻(郭靖/黄蓉)
- 在 MongoDB 中可以通过内嵌文档的形式来体现一对一的关系
db.WifeAndHusband.insert(
{
wife:"HR",
husband:{name:"GJ"}
}
)
db.WifeAndHusband.find()
/*
* {
* "_id" : ObjectId("6013c3afcb67494036ad2a9b"),
* "wife" : "HR",
* "husband" : {
* "name" : "GJ"
* }
* }
*/
一对多(One to Many) / 多对一(Many to One)
-
如 用户–多个订单 、文章 – 多个评论 、黄瓜 – 水果蔬菜等
-
可以使用内嵌文档对映射一对多关系
-
_id username ObjectId(“6013c7e0cb67494036ad2a9d”) 孙悟空 ObjectId(“6013c7e0cb67494036ad2a9e”) 猪八戒
//用户 users 和订单 orders
db.users.insert([{username:"孙悟空"},{username:"猪八戒"}])
db.users.find()
/*
* | _id | username |
* | ------------------------------------ | -------- |
* | ObjectId("6013c7e0cb67494036ad2a9d") | 孙悟空 |
* | ObjectId("6013c7e0cb67494036ad2a9e") | 猪八戒 |
*/
db.orders.insert({list:["西瓜","桃子","橘子"],userId:ObjectId("6013c7e0cb67494036ad2a9d")})
db.orders.find()
/*
* {
* "_id" : ObjectId("6013c836cb67494036ad2a9f"),
* "list" : ["西瓜", "桃子", "橘子"],
* "userId" : ObjectId("6013c7e0cb67494036ad2a9d")
* }
*/
//查询用户孙悟空的订单
var user_id = db.users.findOne({username:"孙悟空"})._id
db.orders.find({userId:user_id})
/*
* {
* "_id" : ObjectId("6013c836cb67494036ad2a9f"),
* "list" : ["西瓜", "桃子", "橘子"],
* "userId" : ObjectId("6013c7e0cb67494036ad2a9d")
* }
*/
多对多(Many to Many)
- 老师 – 学生、分类 – 商品
/*老师、学生*/
db.teachers.insert([
{name:"Jack"},
{name:"Mike"},
{name:"bluce"}
]);
db.teachers.find();
db.studs.insert([
{name:"郭靖",
teacherIds:[
ObjectId("5b4dc529090e87579f7c472c"),
ObjectId("5b4dc529090e87579f7c472d")
]
},
{name:"灰太狼",
teacherIds:[
ObjectId("5b4dc529090e87579f7c472c"),
ObjectId("5b4dc529090e87579f7c472d"),
ObjectId("5b4dc529090e87579f7c472e")
]
}
]);
db.studs.find();