MongoDB学习笔记

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使用一个指定的索引

在某些情形下会提升性能

MongoDB.png

本笔记基于实验楼教程,附链接:
https://www.shiyanlou.com/courses/12

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容