1.主要特点
1.1文档(表中字段:键值对)
由字段和值组成的数据结构,类似与json对象,且字段的值可以包括其他文档,数组和文档数组,但是字段的话只能是字符串;
1.2集合(表)
多个文档组成集合
1.3数据库
MongoDB
中多个文档组成集合,多个集合组成数据库。
Admin 数据库:一个权限数据库,如果创建用户的时候将该用户添加到admin 数据库中,那么该用户就自动继承了所有数据库的权限。
Local 数据库:这个数据库永远不会被复制,可以用来存储本地单台服务器的任意集合。
Config 数据库:当MongoDB 使用分片模式时,config 数据库在内部使用,用于保存分片的信息。
1.4关系
一个MongoDB
实例可以包含一组数据库,一个DataBase
可以包含一组Collection
(集合),一个集合可以包含一组Document
(文档)。
一个Document
包含一组field
(字段),每一个字段都是一个key/value pair
2.基本操作
2.1选择切换
show databases
use admin --选择数据库(若无该数据库则隐式创建)
show collection -- 查看集合(表)
db.createCollection('damage') -- 创建集合(表)damage
db.damage.drop() -- 删除表
db.dropDataBases() --删除库,前提是先use这个库
2.2增删改查
--增(insert)
db.damage.insert({name:'porter',age:18}) --插入Json数据,键不加引号
use admin db.damage.insert({sex:'man'}) --键不加引号,但是查看集合数据时系统会自动加
db.damage.insert([{name:'porter'},{name:'bear'}]) --插入多个值
for(var i=1;i<10;i++ ){db.damage.insert({name:'a'+i,age:i})} --js实现的遍历插入
--查(find)
db.damage.find() -- 查询所有文档,括号内省略了花括号
db.damage.find({age:{$gt:5}}) --db.集合.find({键名:{运算符:值}}),find中两花括号,两冒号
db.damage.find({},{name:1}) --只展示name咧
db.damage.find({},{name:0}) --除了name列都展示
db.damage.find({age:{$in:[5,8,10]}}) --{列名:{$符:值})
-- 修改文档(update)
-- update括号中分为三部分,( {'键值对条件'} ,{'$set:{新键值对}'} ,是否新增,是否修改多条 )
db.damage.update({name:'porter'},{$set:{age:18}},true) --默认为fasle即不新增
db.damage.update({name:'porter'},{$set:{age:22}},false,true) --修改多条数据
db.damage.update({name:'porter;},{$inc:{age:2}}) --给porter的年龄加2,也可以是-2,这样就是减
-- 删除文档(remove)
db.damage.remove({},true) -- 删除整个文档中第一条数据,默认是为false不删除
db.damage.remove({name:'porter'}) --删除名为porter的数据
2.3数据类型
--存储的数据类型
MongoDB中每条记录称作一个文档,和我们平时用的JSON有点像(json缺点没有日期类型,只有一种数字类型,无法区分浮点数和整数,也没法表示正则表达式或者函数)
Binary JSON简称Bson做为MongoDB文档数据存储和网络传输格式
--数字
默认使用的64位浮点数数值
db.damage.insert({x:NumberInt(10)}) -- 使用int类型
db.damage.insert({x:NumberLong(10)})-- 使用long类型
db.damage.insert({x:"hello word"}) --字符串
db。damage.insete({x:new Date()}) --日期
db.damage.insert({x:[1,2.1,new Date()]}) --数组
--正则表达式
db.damage.find({x:/^(hello)(.[a-zA-Z0-9])+/i}) --键为x,值为hello开始的文档且不区分大小写
--内嵌文档
db.damage.inset({book:"西游记",author:{name:"吴承恩",age:99}})
2.4索引
# 索引
--默认情况下,集合中的_id字段就是索引,且集合中最多有64个索引,可提高查询效率,但增删改效率降低,因为要更新文档同时要更新索引
db.damage.getIndexes() --查看集合中索引
db.damage.find({x:1}]).explain("executionStats") --查看查询计划
db.damage.find({x:1}).limit(1)
-- dropDups表创建唯一性索引时如果出现重复,则将重复的删除,只保留第一个
-- background是否在后台创建索引,在后台创建索引不影响数据库当前的操作,默认为false
-- unique 默认为false
-- sparse 对文档中不存在的字段是否不起用索引,默认false
-- v表索引版本,默认为2, weights表索引权重
db.damage.ensureIndex({x:1},{name:"myfirstindex",dropDups:true,background:true,unique:true,sparse:true,v:1,weights:99999})
-- 查看索引
db.damage.totalIndexSize() --查看集合中索引
db.damage.totalIndexSize() --查看索引的大小
-- 删除索引
db.damage.dropIndex('x_1') --删除名为x_1的索引
db.damage.dropIndexes() --删除所有索引(复数)
2.5策略
-- 主从复制 两个服务器或者节点的条件下,主节点,负责处理客户端写操作请求,其它的都是从节点,负责轮询同步主节点的数据 主节点的操作记录称为oplog(operation log),存储在 MongoDB 的 local 数据库中,oplog 中的每个文档都代表主节点上执行的一个操作。需要重点强调的是oplog只记录改变数据库状态的操作。 由于主节点挂了后,需手动从从节点关闭并设为主节点,且数据恢复oplog只在主节点存在 --副本集(复杂) 自动故障恢复功能的主从集群,没有固定的“主节点;整个副本集会选出一个节点作为“主节点”,当其挂掉后,再在剩下的从节点中选举一个节点成为新的“主节点”