MongoDB

MongoDB

NoSQL

Not only SQL 性能高,不使用 SQL意味着没有结构化存储要求,没有约束之后架构更加灵活

  • 列存储,Hbase
  • 键值存储,redis
  • 图像存储 Neo4j
  • 文档存储,MongoDB

MongoDB体系结构

存储在集合中的数据都是BSON格式,BSON格式是一种类似JSON的二进制存储格式

MongoDB 和 RDBMS(关系型数据库) 对比

  • Collection 对应 table 表
  • Document 对应 row 行
  • Field 对应 column 列
  • embedded Document 嵌套文档 对应 join(主外键关联)

MongoDB基本操作

# 查看数据库
show dbs

# 切换数据库
use 数据库名

# 删除当前数据库
db.dropDatabase();

# 创建集合
db.createCollection("order")

show collections

# 删除集合
db.集合.drop();

集合增删改查

查询

use lagou;
db.createCollection("order")
db.oder.insert({name:"joe",birth:new ISODate("2020-01-01)})

# 批量插入
db.oder.insert([{name:"joe",birth:new ISODate("2020-01-01)},
    {name:"lee",birth:new ISODate("2021-02-02)}
])

_id ObjectId类型,12字节 BSON类型数据。

  • 前4个字节表示时间戳
  • 接下来3个字节 机器码
  • 紧接着2个字节 进程id
  • 最后3个字节 随机数

查询

db.order.find({salary:{$gt:1800}})
db.order.find({salary:{$gte:1800}})
db.order.find({salary:{$lt:1800}})

// 逻辑条件 and
db.order.find({salary:{$lt:1800},city:'beijing'})
// or
db.order.find({$or:[{{salary:1800},{city:'beijing'}]})

// not
db.order.find({salary:{$not:{$eq:1800}}})

// 1 升序,-1 降序
db.order.find({salary:1000}).sort({salary:1})

db.order.find({salary:1000}).sort({salary:1})
    .skip(1).limit(2)

更新 删除

// 更新salary 2000到2300,只更新一条,不存在时不插入
db.order.update({salary:2000},{$set:{salary:2300}},
{multi:false,upsert: false})

 // 删除joe Document 的salary字段
db.order.update({name:"joe"},{$unset:{salary:2300}},
{multi:false,upsert: false})

// 删除
db.order.remove({name:"joe"})

聚合

// 按照 city分组,city 出现的次数
db.order.aggregate([{$group:{_id:"$city",city_count:{$sum:1}}}])
// 按照 city分组,salary 平均值
db.order.aggregate([{$group:{_id:"$city",avg_salary:{$avg:"$salary"}}}])

// 管道 match相当于 having,对分组后的数据过滤
db.order.aggregate([{$group:{_id:"$city",avg_salary:{$avg:"$salary"}}},{$match:{avg_salary:{$gt:2000}}}])

// MapReduce, Document转为 key-value结构,对city分组salary求平均
db.order.mapReduce(function(){emit(this.city,this.salary)},
    function(key,value){return Array.avg(value)},
    {out:"avgSalary"})

索引

索引分类

  • 过期索引
  • 复合索引
  • 多键索引,针对数组字段创建的索引
  • 地理空间索引
  • 全文索引
// 全文索引
db.order.createIndex({description:"text"})
db.order.find({"$text":{"$search":"two"}})
  • 哈希索引
    db.order.createIndex({"age":"hashed"})

执行计划分析

executionStats返回逐层分析

  • executionTimeMillis ,语句的执⾏时间
  • executionStages.executionTimeMillisEstimate,检索document获得数据的时间。
  • executionStages.inputStage.executionTimeMillisEstimate,查询扫描⽂档 index所⽤时间

stage类型

  • COLLSCAN:全表扫描
  • IXSCAN:索引扫描
  • FETCH:根据索引去检索指定document
  • SHARD_MERGE:将各个分⽚返回数据
  • PROJECTION:限定返回字段时候stage的返回
  • IDHACK:针对_id进⾏查询

索引原理

B-树,所有节点都有Data域,只要找到指定索引就可以访问数据

MongoDB 数据模型

  • 内嵌,把相关联的数据保存在同一个文档结构中
  • 引用

复制集

复制集是由⼀组拥有相同数据集的mongod实例做组成的集群。
复制集是⼀个集群,它是2台及2台以上的服务器组成,以及复制集成员包括Primary主节点,secondary从节点投票节点

分片集群搭建

use admin;
var cfg = {
    "_id": "configsvr",
    "members": [
        { "_id": 1, "host": "192.168.184.3:17011" },
        { "_id": 2, "host": "192.168.184.3:17013" },
        { "_id": 3, "host": "192.168.184.3:17015" }]
};

rs.initiate(cfg)

// shard1
var cfg = {
    "_id": "shard1",
    "protocolVersion": 1,
    "members": [
        { "_id": 1, "host": "192.168.184.5:37011", "priority": 10 },
        { "_id": 2, "host": "192.168.184.5:37013" },
        { "_id": 3, "host": "192.168.184.5:37015" },
        { "_id": 4, "host": "192.168.184.5:37017", "arbiterOnly": true }
    ]
};
rs.initiate(cfg)
rs.reconfig(cfg)
rs.status()

// shard2
var cfg = {
    "_id": "shard2",
    "protocolVersion": 1,
    "members": [
        { "_id": 1, "host": "192.168.184.4:47011", "priority": 10 },
        { "_id": 2, "host": "192.168.184.4:47013" },
        { "_id": 3, "host": "192.168.184.4:47015" },
        { "_id": 4, "host": "192.168.184.4:47017", "arbiterOnly": true }
    ]
};
rs.initiate(cfg)
rs.reconfig(cfg)
rs.status()

// shard3
var cfg = {
    "_id": "shard3",
    "protocolVersion": 1,
    "members": [
        { "_id": 1, "host": "192.168.184.8:57011", "priority": 10 },
        { "_id": 2, "host": "192.168.184.8:57013" },
        { "_id": 3, "host": "192.168.184.8:57015" },
        { "_id": 4, "host": "192.168.184.8:57017", "arbiterOnly": true }
    ]
};
rs.initiate(cfg)
rs.reconfig(cfg)
rs.status()

// shard4
var cfg = {
    "_id": "shard4",
    "protocolVersion": 1,
    "members": [
        { "_id": 1, "host": "192.168.184.9:58011", "priority": 10 },
        { "_id": 2, "host": "192.168.184.9:58013" },
        { "_id": 3, "host": "192.168.184.9:58015" },
        { "_id": 4, "host": "192.168.184.9:58017", "arbiterOnly": true }
    ]
};
rs.initiate(cfg)
rs.reconfig(cfg)
rs.status()

// config
use admin
var cfg = {
    "_id": "configsvr",
    "members": [
        { "_id": 1, "host": "192.168.184.3:17011" },
        { "_id": 2, "host": "192.168.184.3:17013" },
        { "_id": 3, "host": "192.168.184.3:17015" }]
};
rs.initiate(cfg)

// 添加分片节点
sh.status()
sh.addShard("shard1/192.168.184.5:37011,192.168.184.5:37013,192.168.184.5:37015,192.168.184.5:37017");
sh.addShard("shard2/192.168.184.4:47011,192.168.184.4:47013,192.168.184.4:47015,192.168.184.4:47017");
sh.addShard("shard3/192.168.184.8:57011,192.168.184.8:57013,192.168.184.8:57015,192.168.184.8:57017");
sh.addShard("shard4/192.168.184.9:58011,192.168.184.9:58013,192.168.184.9:58015,192.168.184.9:58017");

sh.enableSharding("lagou_resume")

sh.shardCollection("lagou_resume.lagou_resume_datas", { "name": "hashed" })

// 认证
db.createUser(
    {
        user: "lagou_gx",
        pwd: "abc321",
        roles: [{ role: "readWrite", db: "lg_resume" }]
    }
)


auth = true
keyFile = /home/scott / Mongodb / config / testKeyFile.file

分片

分片集群

  • 路由节点,请求通过路由节点协调
  • 配置节点
  • 分片节点

Neo4j

NoSql 图形数据库,图数据结构的形式来存储和查询书籍的数据库

Neo4j基础

Neo4j 是开源的无Schema 基于java开发的图形数据库,结构化数据存储在图中。

CQL

Cypher查询语言

-- 创建标签 Person,节点person
create(person:Person)

-- 创建person带有属性
create(person:Person {cid:1,name:"joe"})

-- match
match(p:Person) return
match(p:Person {cid:1}) return p.name,ID(p)

-- 现有节点创建 没有属性的关系
match(p1:Person {cid:1}),(p2:Person{cid:2}) create(p1)-[r:Couple]->(p2)


-- 查询关系
match (p1:Person {cid:1})-[r:Couple]->(p2:Person) return p1,p2

-- 使用现有节点创建 有属性的关系
match (p1:Person {cid:1})-[r:Couple {price:1000}]->(p2:Person) return p1,p2 return r;

-- 新节点创建 没有属性的关系
create(p1:Person {cid:3})-[r:Couple]->(p2:Person {cid:4})
-- 新节点创建 有属性的关系
create(p1:Person {cid:3})-[r:Couple {price:2000}]->(p2:Person {cid:4})

WHERE和删除

match(p:Person) where p.price > 1000 return p

match p=(:Person {name:"joe"})-[r:Couple]-(:Person) return p;

-- 删节点
match(p:Person) where p.cid=2 delete p

-- 删关系
match p = (:Person {name:"林婉儿"})-[r:Couple]-(:Person) delete r

-- 删属性
match(p:Person) where p.cid=2 remove p.name

-- 深度运算,查询深度最小1,最大2
match data=(na:Person {name:"joe"}-[*1..2]-(nb:Person) return data
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容