MongoDB

2022-06-30  本文已影响0人  极速魔法

MongoDB

NoSQL

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

MongoDB体系结构

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

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

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类型数据。

查询

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"}})

执行计划分析

executionStats返回逐层分析

stage类型

索引原理

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
上一篇 下一篇

猜你喜欢

热点阅读