MongoDB简介
- MongoDB 是一个面向文档的数据库。
- MongoDB的设计采用横向扩展。面向文档的数据模型使它更容易的在多台服务器之间进行数据分割。
- MongoDB 能自动处理跨集群的数据和负载,自动重新分配文档,及将用户请求路由到正确的机器上。如果一个集群需要更大的容量,只需要想集群添加新服务器,MongoDB就会自动将现有数据想新服务器传送
- MongoDB能对文档进行动态填充,也能预分配数据文件以利用额外的空间来换取稳定的性能。
- MongoDB 把尽可能多的内存用作缓存,试图为每次查询自动选择正确的索引
MongoDB 基础知识
- 文档:文档是mongodb的核心概念。文档就是键值对的一个有序集。
- 建不能含有\0(空字符串)。 这个字符用于表示键的结果
- '.' 和 '$' 具有特殊意义,只能在特定环境使用,通常这两个字符是被保留的。
- 集合:就是一组文档,一个集合就相当于一张表
- 子集合:使用 '.' 分割不同命名空间的子集合。GridFs(一种用于存储大文件的协议) 使用子集合来存储文件元数据。
- 数据库:多个集合组成数据库,在磁盘上不同数据库放置在不同文件中。数据库名为文件名,特殊语义数据库:
- admin 从身份验证角度这是root 数据库,一些特定的服务器命令只能从admin数据库运行,
- local 一台服务器上所以的本地集合都可以存储在这个数据库中
- config 分片设置,分片信息会存在这个数据库中
- MongoDB shell
- 自动JavaScript shell
2.insert 函数将一个文档添加到集合中 - find 函数用于查询集合里的文档,自动显示做多20个匹配文档,若只想查询一个文档,可用findOne
- update 函数用于更新文档,至少接受两个参数,第一个是限定条件(用于匹配待更新文档),第二个是更新文档
- remove 函数用于将文档从数据库中永久删除
- 自动JavaScript shell
- 数据类型 类似于json
- null 用于表示空值活着不存在的字段
- 布尔值 true/false
- 数值 默认使用64位浮点数值 NumberInt类(表示4字节带符号整数) NumberLong类(表示8字符带符号整数)
- 字符串 UTF-8 字符串
- 日期被存储为自新纪元以来经过的毫秒数,不存储时区,创建日期对象时使用 new Date(...)
- 正则表达式 使用正则表达式作为限定条件,语法也与JavaScript的正则表达式语法相同
- 数组 数据列表或数据集可以表示数组
- 内嵌文档 文档可嵌套其他文档
- 对象ID 是一个12字节的ID,是文档的唯一标识
- 二进制数据 是一个任意字节的字符串
- 代码 任意JavaScript代码
- mongodb 中存储的文档必须有一个 "_id" 键。这键值可以是任何类型的,默认是个ObjectId对象。ObjectId使用12字节的存储空间。ObjectId的前4个字节是从标准纪元开始的时间戳,单位为秒。 接下来3个字节是所以主机的唯一标识。通常为主机名的散列值(hash),确保不同主机生成不用的ObjectId。再两位为产生ObjectId的进程的进程标识符(PID),前9个字节保证同一秒钟不同进程产生ObjectId是唯一的。最后三个字节是一个自动增加的计数器。一秒钟最多允许每个进程用拥有256^3(16777216)个不同的ObjectId。如果插入文档时没有"_id"键,系统会自动创建一个,通常会在客户端有驱动程序完成,能交给客户端驱动程序做就不要交给服务器做
创建、更新和删除文档
- insert 方法向目标集合插入一个文档
- batchInsert 函数实现批量插入,接受一个文档数组作为参数
- 所有文档都必须小于16MB
- remove 删除文档,接受一个查询文档作为可选参数
- update 更新文档 两个参数(查询文档,修改器文档)
- $set 用来指定一个字段的值。如果这个字段不存在,则创建它。可以修改值的类型。可以修改内嵌文档。
- $inc 修改器用来增加已有键的值,或者该键不存在那就创建一个。只能用于整形,长整形或双精度浮点型的值。
- $push 向已有的数组末尾加入一个元素,要是没有就创建一个新数组。
- $addToSet 数组中插入值,将数组看做集合可以避免重复插入。
- pop":{"key":1}} 从数组末尾删除一个元素;{"$pop":{"key":1}} 从头部删除
- $pull 将所有匹配的文档删除,而不是删除一个。
- set":{"comment.$.author":"jim"}}) 只更新第一个匹配的元素。
- upsert 没有找到合适更新条件的文档,就会以这个条件和更新文档为基本创建一个新的文档。
- 更新多个文档,默认update更新只能对符合匹配条件到的第一个文档执行操作。要更新所有匹配的文档,可以将update的第4个参数设置为true
- 写入安全机制是一种客户端设置,用于控制写入的安全级别。
- 应答式写入:数据库会给出相应,告知是否成功
- 非应答式写入:不返回任何相应,无法知道是否成功
查询
- find来进行查询,查询返回一个集合中文档的子集
- 通过find的第二个参数来指定想要的键。
- 操作符 lte (小于等于) ; gte (大于等于) ; $ne (不等于)
- $in 可以用来查询一个键的多个值
- $or 可以在多个键中查询任意的给定值
- $nin 将返回与数组中所有条件不匹配的文档
- $not 是元条件句,可以用在任何其他条件之上
- $exists 判断定键值已存在
- $all 查询数组,通过多个元素来匹配数组
- size:3}
- slice:10} {slice:[23,10]}
- where 语句
- $limit 返回限制数量结果
- $skip 略过参数匹配的文档,然后返回余下的文档,尽量避免使用skip,skip数量非常多的话,skip就会变得很慢。
- $sort 接受一个对象作为参数,这个对象是一组键/值对,键对应文档的键名,值代表排序的方向。排序方向可以是1(升序)或者-1(降序)