mongodb简介
mongodb是一个面向文档的数据库,面向文档不再有行的概念,取而代之的是更为灵活的‘文档’模型,通过文档嵌入文档和数组,面向文档的方法能够仅使用一条记录来表现复杂的层次关系。
不再有预定义的模式,文档的键和值不再是固定类型和大小
数据库扩展
- 纵向扩展
- 是指使用能力更强的机器,缺点是大型机器昂贵,而且当数据库达到机器的物理极限时,再也没有更强的机器。
- 横向扩展
- 购买一台普通的服务器并把它添加到集群中。缺点,管理多台机器困难
mongodb解决数据库横向扩展中管理多台机器困难的做法
- 面向对象的数据模型使它很容易在多台服务器之间进行数据分割,mongodb能自动处理跨集群的数据和负载,自动重新分配文档,以及将用户请求路由到正确的机器上。
mongodb基础知识
- 文档是mongodb中数据的基本单元,类似于关系型数据库中的行,键值对的一个有序集(相同字段,字段的顺序不同,文档也不同)
- 集合可以看做是拥有动态模式的表
- mongodb一个实例可以拥有多个相互独立的数据库,每一个数据库都拥有自己的集合
- 每一个文档都有一个特殊的键‘_id’,是在文档所属集合中唯一的。
- 自带js shell 可管理mongodb的实例或数据操作
集合的动态模式
- 一个集合中文档是可以各式各样的,虽然一个集合可以防止不同类型的文档,但是将不同类型的文档拆分为不同的集合,每次查询相应的集合,速度快很多。
集合的命名
- 不能为空,不能包含\0 $ ,不能以system.开头
- 子集合应使用'.'来分割不同的命名空间的子集合
数据库
- 多个文档组成一个集合,而多个集合组成数据库
启动
- 命令 在bin目录下运行cmd mongod --dbpath 数据库文件夹路径
- 如果端口被占用启动失败,通常是已经有一个数据库实例在运行了
javascript shell 与 sql shell
- 在数据库启动的情况下再次进入bin目录运行mongo,可以任意执行js的语法
- 执行db 查看当前指向的数据库
- 通过db变量可以访问其中的集合
shell的基本操作
- 创建: db.集合名.insert(对象),当集合名中包含无效的javascript属性名称是可以使用db.getCollection('集合名')代替。
命令行
-
查看: db.集合名.find()
- find() 和 findone() find查找集合所有的文档,findone可接受一个查询文档为限制条件
-
更新:update接受两个参数,第一个是限定条件(用于匹配待更新的文档),第二个是新的文档
- post.comment = [1,3];
- db.test.update({'title':'test'},post)
-
删除 remove方法可将文档从数据库永久删除,接受限定条件文档作为参数删除,可传入一个空对象将集合所有文档删除
- db.test.remove({'title':'test'})
基本数据类型
-
除了基本的json格式,如:null,true,false,数值,字符串、日期、正则、数组,内嵌文档(即对象嵌套)还增加了:
- 对象id: ObjectId("586db3fcf818ef7cc160e01d") =》 { "i" : ObjectId("586db417f818ef7cc160e01e") },是由时间戳,机器主机散列值、进程标识pid和计数器组成的12字节,每个字节存储两个十六进制数字
- 二进制数据 二进制数据是一个任意字节的字符串,如果要将utf-8字符保存在数据库中,二进制数据是唯一的方式
使用日期时始终用 new Date() 而不是将其当做普通函数调用,因为Date()调用返回的是字符串,而构造函数返回的是一个日期对象,由于日期和字符串之间无法匹配,会导致执行操作时出现很多的问题。
_id,每个文档必须有一个“_id”键,这个值可以是任何类型的,默认是ObjectId对象,在两个集合中可以有相同_id的文档,同一个集合中不允许,确保文档都能被唯一标识
使用shell执行脚本
- D:\mongo\bin>mongo ../test.js
- load('../test.js')