一、概述
Mongo是一个非关系型数据库,由C++语言编写。
数据库类型 | 说明 |
---|---|
关系型数据库 | 由关系模型(二维表格)组织数据的数据库 |
非关系型数据库 | 由键值对组织数据的数据库 |
二、数据组织形式
{
"_id": NumberLong(17506),
"name": "ZhangSan",
"age": 20,
"Job": "Student",
}
{
"_id": NumberLong(17507),
"name": "LiSi",
"age": 35,
"Job": "Doctor",
}
三、语法
1、进入mongo数据库
$ mongo
2、展示所有数据库(如果某数据库没有数据,那么它将不会被展示出来)
> show dbs
3、连接数据库,如果不存在该数据库,则创建数据库
> use <数据库名>
4、显示当前连接的数据库或者集合
> db
5、在当前数据库中创建一个集合
> db.createCollection("<集合名>")
6、展示当前数据库的所有集合
> show tables
7、向集合中添加文档(行)
> db.<集合名>.insert(<数据>)
>db.student.insert({id:1, name:"zhangsan", age:18})
8、查询集合
> db.<集合名>.find([条件]) //查询全部
> db.<集合名>.findOne([条件]) //查询单个
> db.student.find({id:1})
9、修改文档
> db.<集合名>.update(<条件>, <修改后的文档>) //会把整个文档都修改掉
> db.<集合名>.update(<条件>, {$set:{<修改的键值对>}}) //只修改指定键值对
>db.student.update({id:1},{$set:{name:"lisi"}})
10、删除文档
> db.<集合名>.remove({}) //删除所有文档
> db.<集合名>.remove({[指定键值对]}) //删除指定文档
11、统计文档
> db.<集合名>.count([条件]) //统计指定条件的文档数量
12、正则表达式查询
> db.<集合名>.find({<键名称>: /<正则表达式>/})
四、进阶内容
1、为什么要使用非关系型数据库?
(1)对数据库高并发读写的需求:NoSQL的数据存放在内存中(定期备份到硬盘中),而不是像关系型数据库一样存放在硬盘中
(2)对海量数据的高效率存储和访问的需求
(3)对数据库的高可扩展性和高可用性的需求:不用事先定义表结构,可以随时拓展
2、Mongodb锁机制
Mongodb使用读写锁来允许多个用户读取同一资源,比如数据库或者集合。
读采用共享锁,写采用排他锁。
读写锁的概念:一把锁分为两部分 读锁和写锁,其中读锁允许多个线程同时获得,因为读操作本身是线程安全的,而写锁则是互斥锁,不允许多个线程同时获得写锁,并且写操作和读操作也是互斥的。总结来说,读写锁的特点是:读读不互斥、读写互斥、写写互斥。
Mongodb中使用读锁的操作有:查询
使用写锁的操作有:写入、删除、更新、创建索引、执行脚本(eval)。
3、索引
建立索引的作用是提高查询效率,如果你对某一个字段建立了索引,那么系统就会将这个字段的值做为key值去保存,你必须保证该字段值的唯一性。Mongo数据库会在建立集合时,默认为 _id 字段建立索引。
索引背后的实现是B-树。
建立索引的方式为
db.collection_name.createIndex(
{<key>:<n>}
)
key为字段名,n=1为升序,n= -1为降序。
4、数据存储格式——BSON
Mongo的数据存储格式为BSON,是一种类似于JSON的二进制数据格式。其数据类型有:_id、字符串、数字、日期时间、大字段blob、数组和自定义类型。
5、命名空间
Mongo命名空间如下:
数据库名.集合名
6、Mongo查询语句调优
1、使用explain()分析
2、建立唯一索引:可以极大地优化查询速度