MongoDB是介于关系型数据库和非关系型数据库之间的一种非关系型数据库,并且MongoDB是非关系型数据库中最像关系型数据库的数据库。
MongoDB解决MySQL三高的问题
- 对数据库高并发写入需求
- 对海量数据高效率存储访问需求
- 对数据库高扩展和高可用的需求
MongoDB的实际应用
- 社交场景,比如朋友圈,附近的人的地点的存储
- 游戏场景,比如用户当前装备,得分等
- 物流场景,比如快递的位置,状态,途径
- 视频场景,比如直播中的点赞数和互动留言等
缺点
- 不支持事务
- 不支持多表联查
与MySQL的名词对比
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
数据类型
数据类型 | 描述 | 举例 |
字符串 | UTF-8字符串都可表示为字符串类型的数据 | {"x":"foobar"} |
对象id | 对象id是文档的12字节的唯一ID | {"x":Objectld0} |
布尔值 | 真或者假:true或者false | "x":true}+ |
布尔值 | 真或者假:true或者false | "x":true}+ |
数组 | 值的集合或者列表可以表示成数组 | ("x":["a","b","c"]} |
32位整数 | 类型不可用。JavaScript仅支持64位浮点数,所以32位整数会被自动转换 | shell是不支持该类型的,shell中默认会转换成64位浮点数 |
64位整数 | 不支持这个类型。shell会使用一个特殊的内嵌文档来显示64位整数 | shell是不支持该类型的,shell中默认会转换成64位浮点数 |
64位浮点数 | 数shell中的数字就是这一种类型 | {"x":3.14159,"y":3} |
null | 表示空值或者未定义的对象 | ("x":null) |
undefined | 文档中也可以使用未定义类型 | {"x":undefined) |
符号 | shell不支持,shell会将数据库中的符号类型的数据自动转换成字符串 | |
正则表达式 | 文档中可以包含正则表达式,采用JavaScript的正则表达式语法 | {"x":/foobar/i} |
代码 | 文档中还可以包含javaScript代码 | {"x" : function({/*....*/}} |
二进制数据 | 二进制数据可以由任意字节的串组成,不过shell中无法使用 | |
最大值/最小值 | BSON包括一个特殊类型,表示可能的最大值。shell中没有这个类型。 |
条件查询
操作 | 格式 | 范例 | 类似语句 |
等于 | {<key>:<value>} | db. col. find({"by":" 张三丰 "}).pretty ( ) | where by ='张三丰' |
小于 | {<key>: {$lt:<value>}} | db. col. find({"likes": {$lt:50}}).pretty ( ) | where likes < 50 |
小于或等于 | {<key>: {$lte:<value>}} | db. col. find({"likes": {$lte:50}}).pretty ( ) | where likes <= 50 |
大于 | {<key>: {$gt:<value>}} | db. col. find({"likes": {$gt:50}}).pretty ( ) | where likes > 50 |
大于或等于 | {<key>: {$gte:<value>}} | db. col. find({"likes": {$gte:50}}).pretty ( ) | where likes >= 50 |
不等于 | {<key>: {$ne:<value>}} | db. col. find({"likes": {$ne:50}}). pretty ( ) | where likes != 50 |
AND 和 OR 联合使用,类似常规 SQL 语句为: 'where key1>value1 AND (key2 = value2 OR key3 = value3)'
db.col.find({"key1": {$gt:value1}, $or: [{"key2": "value2"},{"key3": "value3"}]})
MongoDB范围条件
col"集合中 "key" 大于100,小于 200 的数据
db.col.find({"key" : {$lt :200, $gt : 100}})
相当于RDBMS: Select * from col where key>100 AND key<200;
MongoDB的模糊查询 (包含使用 /target/ 开头 /^target/ 结尾 /target$/)
查询 name 包含"小"字的文档
db.col.find({"name":/小/})
查询 name 字段以"小"字开头的文档
db.col.find({"name":/^小/})
查询 name字段以"小"字结尾的文档
db.col.find({"name":/小$/})
MongoDB的Limit 和 Skip操作
指定取出文档条数 limit()
db.col.find().limit(NUMBER)
使用skip()方 法来跳过指定数量的数据
db.col.find().limit(NUMBER).skip(NUMBER)
MongoDB的统计
在 MongoDB 中使用count() 来统计个数
db.col.count({key:value})
MongoDB的排序
在 MongoDB 中使用 sort() 方法对数据进行排序,sort() 方法可以通过参数指 定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 1 是用于降序排列。
db.col.find().sort({KEY:1})
索引
- 查看索引
db.collection.getIndexes()
- 创建索引(单个索引,复合索引)
db.collection.createIndex(keys,option)
例如: db.col.createIndex({username:1【, key:1】})
- 删除索引
db.collection.dropIndex(index)
例如: db.col.dropIndex({username:1})