【MongoDB权威指南】一

一 基本

这里是阅读《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
2
3
document = db.data.find(condition)
document.x = 'x'
db.data.save(document)

更新多个文档

一般而言更新只针对符合condition的第一个文档,如果想要更新所有符合条件的文档,那么把第四个参数设置为True。

修改器的速度

\$inc当然最快,不用新增啥。\$set在不增加键的情况下也是极快的,但是对数组的操作有可能会比较耗性能。

以上操作都是瞬间完成的,不会卡住客户端,客户端发出命令后可以继续工作。当然也有同步版本,会执行完之后返回结果码。

连接

对一个连接里面的命令使用队列来决定执行先后。但是python等语言有连接池的概念,可能会把命令派发到各个连接去,导致执行顺序错乱。

Buy Me A Coffee / 捐一杯咖啡的钱
分享这篇文章~
0%
//