首发于安恒公众号
这几天读了一本《MongoDB权威指南》的动物书,简单了解了这类nosql(Not Only SQL)数据库的操作语句。书上的业务层面以及sql优化部分我就略过了。书上是2.x版本的MongoDB,部分语句已经废弃了,在踩坑后我把那些删掉了
Mongo的最大特点就是存储数据格式的多样化和反关系范式:相对于关系化数据库的”矩形”存储格式,Mongo可以存储任意的json格式数据,例如{'u': 'admin', 'pwd': '***'}。当然有利必定有弊,假如存储的是格式化的数据,如用户表这样每一行都是相同字段,那么每一行都需要存储一遍字段名,解决办法?字段名取短一点,就像我举得例子一样
反关系范式需要好好设计,根据读写比例,在数据冗余的数据引用之间做好平衡。比如用户表里的用户粉丝,我会这样设计:{'u': 'admin', 'e': 'x@x.cc', 'tel': '110', 'sex': 1, 'fs': [{'u': 'user1', 'sex': 1}, {...}]}。经常和用户一起查询出的粉丝信息内嵌入文档中(用户名,性别),避免跨表查询;而其余信息则使用用户引用查询(邮箱,电话)
核心思想
在MongoDB中,没有表、列的概念,取而代之的是集合(collection)、文档(document)库(DB):数据库,包含多个集合
当前数据库名存储在全局变量db中
admin库,库中用户有数据库所有权限,local库,不可复制,本地数据库,config库
集合(Collection):一组文档
以名称进行标识,不能为空字符串
不能以system.开头,不能使用字符$(特殊含义字符)
文档(Document):键值对的一个有序集,即有序的哈希表
键值不能有'\0'
不能存在.和$
区分类型("1"和1)与大小写
MongoDB内置JavaScript解释器,它的文档是JS中的对象({...}),就是那种没成员函数的对象
MongoDB运行于27017端口,且启动后会在28017端口启动一个基本的Http服务器。启动后会连接到test数据库,use [database]切换当前数据库
MongoDB以BSON格式保存数据,即Binary Json
CRUD操作
观察发现:MongoDB中的方法函数基本都是以JavaScript命名习惯的,即word1Word2Word3,如addEventListener
文档插入后会自动添加一个_id属性,为唯一标识符{"_id": ObjectId("56064886ade2f21f36b03134")}
Create
创建数据库
> use [newdbname]//不存在