MongoDB
基本概念
数据库
MongoDB一个数据库包括多个集合,类似于MySQL中一个数据库包含多个表;一个集合包含多个文档,类似于MySQL中一个表包含多条数据
一个MongoDB可以创建多个数据库
使用show dbs查看所有数据库的列表
执行db命令则可以查看当前数据库对象或者集合
运行use命令可以连接到指定的数据库
文档
概念:文档是MongoDB的核心,类似于SQLite中的每一行数据。多个键及其关联的值放在一起就是文档。
注:在MongoDB中使用一种类json的bson存储数据,bson数据可以理解为在json的基础上添加了一些json中没有的数据类型。
文档的逻辑关系
嵌入式
将另一个文档嵌入为一个文档的一个键值对
引用式
将两个文档分开,通过引用文档 _id 字段来建立关系
集合
集合就是一组文档的组合,相当于关系数据库中的表,在MongoDB中可以存储不同文档结构的文档。
元数据
概念:数据库的信息存储在集合中,他们统一使用系统的命名空间:DBNAME.system.* DBNAME可用db或数据库名替代
常用元数据
DBNAME.system.namespaces:列出所有的命名空间
DBNAME.system.indexes:列出所有索引
DBNAME.system.profile:列出数据库概要信息
DBNAME.system.users:列出访问数据库的用户
DBNAMES.system.sources:列出服务器信息
基本操作
数据库
创建
use mydb
如果mydb不存在则创建
查看
db
查看当前连接数据库
show dbs
查看所有数据库
销毁
db.dropDatabase()
集合
创建
db.createCollection(name,options)
name
####### 集合名
options
####### 初始化参数文档
####### capped
######## Boolean
######### true
########## 创建一个固定大小的集合,当条目达到最大的时候,自动覆盖之前的条目
########## 同时需要指定参数大小
####### autoIndexID
######## Boolean
######### true
########## 在_ id filed.s上自动创建索引
######### 默认为false
####### size
######## 与capped: 1 联合使用
######## 指定参数的最大值,单位byte
####### max
######## 指定最大的文档数
查看
show collections
删除
db.users.drop()
删除users集合
文档
插入数据
insert()方式
如果没有对应的集合会自动创建
db.users.insert([
{ name:"jam:",
email : "jam@gmail.com"
},
{
name : "tom",
email : "tom@gmail.com"
}
])
save()方式
如果没有对应的集合会自动创建
db.users.save([
{ name:"jam:",
email : "jam@gmail.com"
},
{
name : "tom",
email : "tom@gmail.com"
}
])
Insert和Save的区别
当主键_id存在时,Insert不做任何处理,Save做update处理
可以先定义文档,再进行插入操作
userdoc1=({"user_id":1,"name":"cloud","state":"active","actor":"user","e-mail":"test@qq.com","VM_num":2,"time":[{"date":"2014-08-12","hour":"10:53 PM"}] })
db.shiyanlou.insert(userdoc1)
更新数据
db.COLLECTION_NAME.update(SELECTION_CRITERIA, UPDATED_DATA)
SELECTION_CRITERIA表示查找条件
UPDATED_DATA表示更新后的数据
默认update函数只对一个文档进行更新
如果需要作用于所有文档,则需要加入multi:true
删除文档
db.COLLECTION_NAME。remove(DELECTION_CRITERIA)
数据操作
导入
mongoimport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 --type 文件类型 --upsert --drop 文件名
导出
mongoexport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 -f 字段 -q 查询条件
备份
mongodump -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -o 文件路径
恢复
mongorestore -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 --drop 文件路径
数据查询
查询语句 find()
db.COLLECTION_NAME.find()
无参数
返回所有数据
db.COLLECTION_NAME.find().pretty()
使查询输出结果更美观
比较条件操作符
$gt
$lt
$gte
$lte
类型比较操作符
$type
1
####### 双精度
2
####### 字符串
3
####### 对象
4
####### 数组
5
####### 二进制数据
7
####### 对象ID
8
####### 布尔类型
9
####### 数据
10
####### 空
11
####### 正则表达式
13
####### JS代码
14
####### 符号
15
####### 有作用域的JS代码
16
####### 32位整型数
17
####### 时间戳
18
####### 64位整型数
255
####### Min key
127
####### Max key
AND和OR
当find()中同时传入多个键值对时,默认为AND查询
使用$or关键字
db.post.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
可以同时使用AND和$or
db.post.find({
"likes": {$gt:10},
$or: [
{"by": "shiyanlou"},
{"title": "MongoDB Overview"}
]
}).pretty()
limit()
读取指定数量的数据记录
db.blog.fine().limit(100)
skip()
读取时跳过指定数量的数据记录
db.blog.fine().limit(100).skip(50)
sort()
升序 1
db.blog.fine().limit(100).sort({key:1})
降序 -1
db.blog.fine().limit(100).sort({key:-1})
索引 ensureIndex()
概念
索引是特殊的数据结构,存储在一个易于遍历读取的数据集合中,索引是对数据库集合中一个文档或者多个文档的值进行排序的一种结构
语法
db.COLLECTION_NAME.ensureIndex({key,1|-1})
1为升序,-1为降序
可选参数
background
Boolean
建立索引要不要阻塞其他数据库操作,默认为false
db.COLLECTION_NAME.ensureIndex({key,1|-1},{background:1})
unique
Boolean
建立的索引是否为唯一,默认为false
name
string
索引的名称,若未指定,系统自动生成
dropDups
Boolean
建立索引时,是否删除重复记录,默认false
sparse
Boolean
对文档不存在的字段数据不启用索引,默认为false
expireAfterSeconds
integer
设置集合生存时间,单位s
v
Index version
索引版本号
weights
document
索引权重值,范围1-99999
default-language
string
默认为英语
language_override
string
默认为language
聚合 aggregate()
语法
db.COLLECTION_NAME.aggregate({
$match:{x:1},
{limit:NUM},
$group:{_id:$age}
})
可选参数
$match
查询,和find一样
$limit
限制显示结果数量
$skip
忽略结果数量
$sort
排序
$group
按照给定的表达式组合结果
聚合表达式
$sum
求和
$abg
求平均
$min和$max
计算最小和最大
$push
在结果文档中插入值到一个数组
$addToSet
在结果文档中插入值到一个数组,但不创建副本
$first
根据资源文档的排序获取第一个文档数据
$last
根据资源文档的排序获取最后一个文档数据
管道
概念
MongoDB的聚合管道将文档在一个管道处理完毕后的结果传递给下一个管道处理。
管道操作是可以重复的
表达式
处理输入文档并输出
表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其他的文档
常用操作
####### $project
######## 修改输入文档的结构
######## 可以用来重命名、增加或者删除域,也可以用于创建计算结果以及嵌套文档
####### $match
######## 用于过滤数据,只输出符合条件的文档
####### $limit
####### $skip
####### $unwind
######## 将文档中某一个数组类型字段拆分成多条,每条包含数组中的一个值
####### $group
######## 将集合中的文档分组,可用于统计结果
####### $sort
####### $geoNear
######## 输出接近某一地理位置的有序文档
例如
db.shiyanlou.aggregate([{$match:{user_id:{$gt:0,$lte:2}}},{$group:{_id:"user",count:{$sum:1}}}])
高级查询与索引
覆盖索引查询
所有的查询字段多都是索引的一部分;所有的查询返回字段在同一个索引中
由于索引存在于RAM中,因而从索引中获取数据要比扫描文档更快
高级索引
索引数组字段,在数组中创建索引,需要对数组中的每个字段依次建立索引
索引子文档字段
原子操作
所谓原子操作,就是要么执行成功,要么执行失败
执行成功完成既定任务,执行失败还原执行前的状态
常用原子操作命令
$set
$unset
$inc
$push
$pushAll
$pull
$pop
$rename
$bit
查询分析
explain()
提供了查询信息,使用索引及查询统计等
结果字段解释
indexOnly
####### true表示使用了索引
cursor
####### 因为这个查询使用了索引,MongoDB中索引存储在B树结构中,所以这也是使用了BtreeCursor类型的游标。
如果没有使用索引,游标的类型是BasicCursor。这个键还会给出所使用的索引的名称,你通过这个名称可以查看当前数据库下系统自动创建的system.indexes集合来得到索引的详细信息。
n
####### 当前查询返回的文档数量
nscanned/nscannedObjects
####### 表明这次查询一共扫描了集合中多少个文档
我们的目的是让这个数值和返回文档的数量越接近越好
millis
####### 当前查询所需时间
####### 单位:毫秒
indexBounds
####### 当前查询具体使用的索引
hint()
强迫MongoDB使用一个指定的索引
在某些情形下会提升性能
本笔记基于实验楼教程,附链接:
https://www.shiyanlou.com/courses/12
网友评论