-----------------概述-----------------------
1.mongodb 使用了文档,而不是行,没有了schema的约束,支持更多类型,修改更方便,传统mysql修改schema,尤其是数据比较多的时候很痛苦
2.mongodb不支持join操作,因为这个在分布式中效率不高
3.mongodb支持time-to-live类型的collections,可以很好的用来存储session
4.mongodb会为文档之间预留空间padding,来对修改文档提供稳定的性能,否则要删除重建。
5.mongodb设计初衷为不牺牲性能,所以一些传统数据库的特性支持的不好,需要客户端自己处理
-----------------概念-----------------------
1.document 类似于RDB的行,但是更具表现力
2.collection类似于RDB的table,但是schema是动态的dynamic
3.一个mongoDb实例可以包含多个独立的数据库databases,每个database有自己的collection
4.每个document都有一个特殊的key,"_id"在一个collection中他是唯一的
5.Mongodb有一个shell,用javascript语言管理数据库
--------------------------基础知识----------------------
1.Document ---一组set有序的key和他关联的值组成的集合。
- 每个变成语言都有这种数据结构,如map,hash,dictionary,javascript中表示为对象。
{"greeting" : "Hello, world!"}
- 文档的值可以是一个基础类型,也可以是一个内嵌文档
- key只能是一个UTF8的字符串,和C语言一样,\0结尾,所以不能包含\0。点和$都是保留字符
- mongodb是一个类型敏感的,大小写页面干,3和"3"是不同的类型
- key是不可以重复的。并且key是有序的。不同的顺序表示不同的文档,如下。但是同常,顺序不重要,这两个文档在实际使用中作用是一样的,好多语言对文档类型map本身没有顺序要求。
{"x" : 1, "y" : 2}
{"y" : 2, "x" : 1}
2.collections
3.dynamic schemas
- 同一个collection可以有不同schema的文档
{"greeting" : "Hello, world!"}
{"foo" : 5}
- 但是collection还是必要的,数据类型可以不同,但是总归还是同一类数据,并且速度上,分开查询更快,索引同一个字段。
3.naming---------collection有一个utf8的名字
- ”“不允许
- 不能包含\0
- 不能以system开头,这个系统的保留前缀
- 不能有$
4.子集合blog.authors blogs.posts,用点分开
- 子集合和所谓的父(这里是blog)并没有关系,只是名义上的组织关系
- 但是子集合在GFS和语法糖上有用处,比如db.blog.posts db.blog,让他们用起来更有逻辑性
5.databases - 名字不能包含"",/, \, ., " , *, <, >, :, |, ?, $, (,\0 。基本上只能用ASCII定义的字符和数字
- 名字大小写是敏感的,最长64bytes
- 数据库名---这么多限制是因为,最终一个数据库名最终会变成文件名的一部分
- 预留数据库名字 admin----root数据库,一个用户添加到这个数据库,就与偶所有数据库的权限。还有一些名列---如列出所有数据库,关闭服务器,只能在这个库运行
- 预留数据库名字local----这个数据库没有副本,智慧保留本地
- 预留数据库名字config----这里用来保存shard信息
6.mongo shell ----直接命令行mongo即可打开
7.mongo client - mongoshell 真正的威力是他本身是一个独立的mongo client ,启动的时候建立连接,并将链接赋值给全局变量db
mongo shell 提供了一些非js的扩展语法糖
use footbardb #选择使用数据库,
db #显示当前db
8.基础操作
create
post = {"title" : "My Blog Post",
... "content" : "Here's my blog post.",
... "date" : new Date()}
{
"title" : "My Blog Post",
"content" : "Here's my blog post."
}
db.blog.insert(post)
db.blog.find()
{
"_id" : ObjectId("5037ee4a1084eb3ffeef7228"),
"title" : "My Blog Post",
"content" : "Here's my blog post.",
"date" : ISODate("2012-08-24T21:12:09.982Z")
}
read ---
db.post.findOne()
update (限定条件,新的文档),只会更新新文档中的字段
db.blog.update({title : "My Blog Post"}, post)
- remove(限定条件)
9.类型 - 类似json,但是json仅有6种类型 null, boolean, numeric, string, array, object。不支持日期类型,数字类型无法区分浮点数和整数。无法表示long类型,还有通用类型:正则---函数等
- mongodb保持json的基础上,增加了其他类型。
- null 表示空值,或者不存在的字段
- boolean ---true ,false
number ---默认64位浮点数,还有numberInt,numberLong类
{"x" : 3.14}
{"x" : NumberInt("3")}
{"x" : NumberLong("3")}
string
{"x" : "foobar"}
date 日期被存储为新纪元以来的毫秒数.注意Date返回的是日期的字符串,new Date才是返回Date对象
{"x" : new Date()}
regular expression正则表达式类型,使用与查询条件
{"x" : /foobar/i}
array ----数据列表,注意数组中可以包含不同类型。而且可以在数组上创建索引,从而优化数组中的查询速度
{"x" : ["a", "b", 3]}
内嵌文档embedded document,内嵌文档,同样可以创建索引,如果你想根据内嵌文档的key搜索这个文档
{"x" : {"foo" : "bar"}}
object id---12 byte的id,12个bytes,显示成24个16进制数,包含时间信息(可以获取).由客户端的driver生成。
{"x" : ObjectId()}
- 1 2 3 Timestamp
5 6 Machine
7 8 PID
9 10 11 Increment
- binary data ----任意字节的字符串,不能直接在shell中使用
code 查询中,或者文档中可以包含代码
{"x" : function() { /* ... */ }}
10.
、