共计 1667 个字符,预计需要花费 5 分钟才能阅读完成。
第二章. MongoDB 基础知识
1 文档
文档相当于关系型数据库中的 row。
文档中的键值对是有序的。
2 集合
一个集合就相当于一个表。
2.1 动态模式
假设集合里面一个名为 ”type” 的字段用于指明文档是水果还是蔬菜,那么应该将这两种 不同类型的文档拆分成两个集合。
2.2 子集合(有疑问)
使用“.”分割不同命名空间的子集合。在 MongoDB 中,使用子集合来组织数据非常高效,值得推荐。
3 数据库
多个文档组成集合,多个集合组成数据库。
数据库名应全部小写。
数据库最终会变成文件系统中的文件,所以数据库名有很多限制。
自带保留数据库:
- admin
对应“root”数据库,添加一个用户后,自动获取所有数据库权限。
- local
永不可复制
- config
存储分片信息
4 启动
默认启动 C:\data\db
目录,不存在会报错。
5 MongoDB shell
shell 是一个功能完备的 JavaScript
解释器,可运行 JavaScript
程序。
Mongo 可使用 JavaScript
标准库,定义和调用 JavaScript
函数。
db.help()
查看数据库级别的帮助,db.foo.help()
查看集合级别的帮助。
5.1 创建
> db.blog.insert({"name":"Rohan","date":new Date()})
5.2 读取
- find()
shell 会自动显示最多 20 个匹配的文档
- findOne()
5.3 更新
update 至少接受两个参数
6. 数据类型
Mongo 在 JSON 包含的六种数据类型:null
、布尔、数字、字符串、数组和对象。的基础上新增了其他类型:
- null
- 布尔型
- 数值型
默认 64 位浮点型数值,整型 eg:
{"x" : NumberInt("3")}
- 字符串
- 日期
{"x" : new Date()}
- 正则表达式
{"x" : /foobar/i}
- 数组
可以包含不同数据类型的元素
- 内嵌文档
- 对象 id
{"x" : ObjectId()}
- 二进制数据
- 代码
可以包含任意 JavaScript 代码
第三章. CRUD
3.1 插入
db.foo.insert({"bar" : "baz"})
- 批量插入
batchInsert
接收的参数是一个数组里面嵌套字典,此时会生成多个 document,eg:
db.foo.batchInsert([{"name" : "Rohan"},{"sex": "None"}])
批量插入的最大消息为 48MB,超过时,多数驱动程序会将这个请求拆分为多个 48MB 的请求。
批量插入时,某个文档失败时,之前插入的 OK,后续的无法进行,如果期望忽略错误,可以使用
continueOnError
选项。 - 校验
所有的文档必须小于 16MB,
Object.bsonsize(doc)
查看文档大小
3.2 删除
db.foo.remove({"可选":"键值对"})
永久删除,不能撤销,不能恢复。
- 清空集合(表)
db.foo.drop()
速度更快
3.3 更新
db.foo.update({"定位器":"value"},{新的集合})
此操作属于将新的文档完全替换掉了目标文档,甚至包括 _id
,当然_id
不能重复不然失败。千万小心使用!!!
3.3.1 修改器
-
$set
修改器指定定位器文档的一个字段的值,如果这个字段不存在,则创建;存在则更新:
do.foo.update({"user":"Rohan"},{"$set":{"最喜欢的语言":"Python"}})
注意此处
$set
后面跟着一个字典,是一个嵌套文档。$set
可以修改值的类型,从字符串变为 list。$set
可以修改嵌套文档,eg:do.foo.update({"user":"Rohan"},{"$set":{"address.company":"山东"}})
$unset
可以将这个键完全删除,eg:do.foo.update({"user":"Rohan"},{"$unset":{"最喜欢的语言":1}})
-
$inc
数值修改器同样字段不存在,则创建;存在则在原有基础上增加,只能是数字,eg:
do.foo.update({"user":"Rohan"},{"$inc":{"Age":25}})