mongodb概念 | 类比sql概念 |
---|---|
文档document,拥有唯一的键值”_id” | 复杂的行 |
集合collection | 没有模式的表 |
单个实例 - 容纳多个独立的数据库 |
文档document
文档:多个 键key
及其关联的 值value
有序地
放置在一起。
在各种编程语言中表现不同:python字典
,ruby散列
,Go等的映射
。
{“key” : value}
- 文档中的
键值(k-v)
是有顺序的。
{"k1":v1,"k2":v2}
不同于{"k2":v2,"k1":v1}
值v
可以是多种数据类型:字符串
,数值
或者另一个文档
等。键k
是字符串。utf-8字符。键值(k-v)
是区分键大小写
和值类型
的。键k
不能重复。
键的命名
满足下述条件的任意 utf-8
字符串。
- 不能含有结尾符
\0
。 - 不能含有保留字符
.
和$
。 - 不能以
_
开头。(键是被保留的)
集合collection
集合:文档的集合。类似没有模式的表。
无模式
值可不同,键也可不同。
{“greeting” : "hello",
"foo" : 3}
为什么使用多个集合?
查询简易度
和查询速度
会提升。- 把同类型的文档放在一起,这样数据会更加集中。
- 创建索引时,文档会有附加的结构。索引更有效。
命名
满足下述条件的任意 utf-8
字符串。
- 不能是空字符串
""
。 - 不能含有结尾符
\0
。 - 不能含有保留字符
$
。 - 不能以
system.
开头。
子集合
使用 "."
分开的按命名空间划分的子集合,更好的组织数据。如,
blog.posts
blog.authors
数据库 database
数据库:集合的集合。
命名
满足下述条件的任意 utf-8
字符串。
- 不能是空字符串
""
。 - 不能含有结尾符
\0
。 - 不能含有
单引号''
,空 格
,点.
,钱$
,正反斜杠 / \
。 - 全部
小写
。 - 最多
64
字节。 - 不能是保留名:
admin
,local
,config
因为数据库名最终会变成文件系统
里的文件,所以限制较多。
命名空间
- 命名空间:database_name.collection_name 组成命名空间。
- 命名空间长度 <=
121
字节。实际中应 <=100
字节。
mongodb shell
mongo.exe
,一个自带的 javascript shell
。从命令行和mongodb交互。
在运行shell
mongo.exe
前,请确保启动数据库服务器mongod.exe
。
选择数据库
use foobar // db = foobar
查看数据库
db
1. 增 / 创建文档
db.collection_name.insert(new_doucment)
2. 增 / 增加键值
db.collection_name.update(限定条件_如_{"title":"foo"}, new_key_value)
3. 删 / 删除
db.collection_name.remove(限定条件_如_{"title":"foo"})
4. 查 / 读取
db.collection_name.find() // 返回集合里所有的文档
db.collection_name.findOne() // 返回一个文档
帮助 help
shell中键入 help
获得帮助
help
db.help() // 数据库相关的帮助
db.collection_name.help() // 集合相关的帮助
function_name // 函数不加括号,显示该函数的js代码
db.集合名
db.name
- 当js只有在db中找到
同名
属性时,会将其作为方法而非集合名。如,db.version
- 当集合名包含运算符时,如
db.foo-bar
。会做减法运算而报错。
解决方法,使用getCollection
方法:
db.getCollection("collection_name")
db.getCollection("version")
db.getCollection("foo-bar")
变量访问子集合
在js中 x.y = x['y']
,也就是说,
db.collection_name.sub_name = db.collection_name[sub_name]
可以如下优雅的书写,
var sub_collections = ["foo", "bar", "zzz"];
for (i in collections) {
doStuff(db.collection_name[sub_collections]);
}
而不用如此笨拙,
doStuff(db.collection_name.foo);
doStuff(db.collection_name.bar);
doStuff(db.collection_name.zzz);
数据类型
下面介绍shell中支持哪些mongodb的数据类型的显示。
数据类型 | 描述 | 示例 |
---|---|---|
null | 空值 | {“x” : null} |
bool | true or false | {“x” : true} |
i32 | shell不支持 | 会被转换为64bit float |
i64 | shell不支持 | 会被转换为64bit float |
f64 | shell中数字都是此类型 | {“x” : 3.14} |
上述的整数也是此类型 | {“x” : 3} | |
string | 字符串,utf-8 | {“x” : “foobar”} |
ObjectId | 文档的 12字节 唯一ID | {“x” : ObjectId()} |
date | 日期,从标准纪年的毫秒数 | {“x” : new Date()} |
re | 正则表达式,采用js语法 | {“x” : /foobar/i} |
code | js代码 | {“x” : function() {/* … */}} |
符号 | shell不支持 | shell将db中的符号转化为字符串 |
二进制数据 | shell不支持 | |
最大值 | shell不支持 | |
最小值 | shell不支持 | |
undefined | js中null和undefined是不用类型 | {“x” : underfined} |
array[] | 值和列表的集合 | {“x” : [“a”, “b”, “c”]} |
内嵌文档{} | 文档包含文档 | {“x” : {“y”: “bar”}} |
数字
因为js只有1种数字类型(f64),而mongodb有3种(i32,i64,f64)。如果数据库中的数字是i32,在shell中修改后,传回db的数将变成f64。所以
不要在shell下覆盖整个文档。
日期
new Date()
返回的是从标准纪年的毫秒数。- 而单调用构造函数
Date()
则返回的是字符串。
注意,Date函数首字母是大写。
数组
数组可以作为有序对象操作(像列表,栈,队列),也可以作为无序对象操作(如集合)。能用内容对数组进行查询和构建索引。
文档
文档可以内嵌文档。
_id
- 文档必须
只有
一个”_id”的键。这个键可以是任意类型,但默认是ObjectId对象。 - 2个集合可以有一个相同”_id”键。
ObjectId
使用12字节存储空间。其结构如下:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11
timestamp | machine | PID | counter
尽量在客户端生成
ObjectId
。
设计理念
能从 服务器端
转移到 客户端驱动程序
来做的事就尽量转移。扩展 应用层
比扩展 数据库
容易的多。
参考
《mongodb权威指南》
彩蛋
祝大家戊戌狗年旺旺旺!