一 基本
这里是阅读《MongoDB权威指南》一书所做的读书笔记。这将是一个系列,划分标准大概是章节。放到博客上面来,自我监督把书啃完,消化完转化成自己的文字出来。
此为本系列第一篇,主要讲最普通的增删改查以及如何获取命令帮助。
MongoDB是一个nosql,意味着它不用定义一个表的列有哪些,而是可以把它当作一个序列化json的工具来使用。MongoDB对脚本语言特别友好,python的dict或者lua的table都可以直接作为一个object放进去。
基本概念
在MongoDB这里:
- 集合等同于表
- 文档等同于行
mongo命令执行完之后,其实是进入一个javascript shell,里面可以运行任何js指令,而且加入了mongodb自定义的语法糖(如show)。
基础操作
以下假设集合名称(collection name)为cn,数据为data。
- 使用数据库 use dbname
- 插入操作 db.cn.insert(data)
- 寻找
- db.cn.find()
- db.cn.findOne()
- db.cn.find(condition) condition为条件
- 更新 db.update(condition, newData)
newdata指把整个文档换掉。如果只是想更新部分文档,应该这么写'$set': deltaData
。 - 删除 db.remove(condition)
此外,help
指令可以显示出所有的帮助,其中有几个值得萌新关注:
- show dbs 显示所有的数据库
- db.help() 显示所有数据库相关的函数
- db.mycoll.help() 显示所有集合相关的函数
如果不调用函数,只输入函数名,会在控制台打印该函数的源码。譬如:
1 | db.cn.update |
更新
除了一整个儿更新以外,还可以使用部分更新,这个时候使用特殊的键来做调整。
php程序员就蛋疼了,他们的变量用$开头的。。
$inc 自增某个参数,譬如
1
db.data.update(condition, {'$inc': {'key': nIncrement}})
如果inc的变量并不存在,会先初始化为0。
- $set 增量更新
- $unset 增量删除,删除某个字段
- $ne 不等于
$push 推入数组
1
db.data.update(condition, {'$push': {'array_name': newRowData})
$addToSet 把数组作为集合看待,不会插入一样的数据
$pop 数组当作堆栈或者队列看来删除元素
1
db.date.update(condition, {'$pop': {'array_name', -1}})
$pull 删掉数组中所有匹配的部分
- $ 查询数组并更新
1
db.data.update({'array.field1': condition}, {'$set': {array.$.field1: deltaData}})
upsert
如果找得到就更新,如果找不到就插入。避免在代码层进行判空。原子性操作,避免竞态问题。
save
对文档进行操作,要求参数里面含有_id域,如果不存在则会创建新的文档。
1 | document = db.data.find(condition) |
更新多个文档
一般而言更新只针对符合condition的第一个文档,如果想要更新所有符合条件的文档,那么把第四个参数设置为True。
修改器的速度
\$inc当然最快,不用新增啥。\$set在不增加键的情况下也是极快的,但是对数组的操作有可能会比较耗性能。
以上操作都是瞬间完成的,不会卡住客户端,客户端发出命令后可以继续工作。当然也有同步版本,会执行完之后返回结果码。
连接
对一个连接里面的命令使用队列来决定执行先后。但是python等语言有连接池的概念,可能会把命令派发到各个连接去,导致执行顺序错乱。