这篇文章上次修改于 2019 天前,可能其部分内容已经发生变化,如有疑问可询问作者。 -----------------概述----------------------- 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中表示为对象。 ```javascript {"greeting" : "Hello, world!"} ``` + 文档的值可以是一个基础类型,也可以是一个内嵌文档 + key只能是一个UTF8的字符串,和C语言一样,\0结尾,所以不能包含\0。点和$都是保留字符 + mongodb是一个类型敏感的,大小写页面干,3和"3"是不同的类型 + key是不可以重复的。并且key是有序的。不同的顺序表示不同的文档,如下。但是同常,顺序不重要,这两个文档在实际使用中作用是一样的,好多语言对文档类型map本身没有顺序要求。 ```javascript {"x" : 1, "y" : 2} {"y" : 2, "x" : 1} ``` 2.collections 3.dynamic schemas + 同一个collection可以有不同schema的文档 ```javascript {"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的扩展语法糖 ```bash use footbardb #选择使用数据库, db #显示当前db ``` 8.基础操作 + create ``` javascript 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 --- ```javascript db.post.findOne() ``` + update (限定条件,新的文档),只会更新新文档中的字段 ```javascript 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类 ```javascript {"x" : 3.14} {"x" : NumberInt("3")} {"x" : NumberLong("3")} ``` + string ```javascript {"x" : "foobar"} ``` + date 日期被存储为新纪元以来的毫秒数.注意Date返回的是日期的字符串,new Date才是返回Date对象 ```javasctript {"x" : new Date()} ``` + regular expression正则表达式类型,使用与查询条件 ```javascript {"x" : /foobar/i} ``` + array ----数据列表,注意数组中可以包含不同类型。而且可以在数组上创建索引,从而优化数组中的查询速度 ```javascript {"x" : ["a", "b", 3]} ``` + 内嵌文档embedded document,内嵌文档,同样可以创建索引,如果你想根据内嵌文档的key搜索这个文档 ```javascript {"x" : {"foo" : "bar"}} ``` + object id---12 byte的id,12个bytes,显示成24个16进制数,包含时间信息(可以获取).由客户端的driver生成。 ```javascript {"x" : ObjectId()} 0 1 2 3 Timestamp 4 5 6 Machine 7 8 PID 9 10 11 Increment ``` + binary data ----任意字节的字符串,不能直接在shell中使用 + code 查询中,或者文档中可以包含代码 ```javascript {"x" : function() { /* ... */ }} ``` 10.
没有评论