mongodb入门知识

什么是nosql
对不同于传统的关系型数据库的数据库管理系统的统称

nosql数据库的分类
列存储 (HBase)
文档存储(MongoDB)
Key-Value存储(redis)
图存储(FlockDB)
对象存储(db4o)
XML存储(BaseX)

为什么要用NoSql
简单(没有原子性、一致性、隔离性等复杂规范)
便于横向扩展
适合超大规模数据的存储
很灵活地存储复杂结构的数据(Schema Free)

什么是mongodb
一个以json为数据模型的文档数据库。
主要用途
应用数据库,类似于oracle、mysql海量数据处理,数据平台。
主要特点
建模为可选,json数据模型比较适合开发者,横向扩展可以支撑很大数据量和并发。

社区版sspl免费协议
企业版 企业管理付费使用

moogodb的优势

简单直观:
以自然的方式来建模,以直观的方式来与数据库交互。

结构灵活:
弹性模式从容响应需求的频繁变化。

快速开发:
做更多的事,写更少的代码。

灵活:快速响应业务变化
多形性:同一个集合中可以包含不同字段(类型)的文档对象。
动态性:线上修改数据模式,修改是应用与数据库均无须下线。
数据治理:支持使用json schema来规范数据模式。在保证模式灵活动态的前提下,提供数据治理能力。

JSON模型之快速特性
数据库引擎只需要在一个存储区读写
反范式、无关联的组织极大优化查询速度
程序api自然、开发快速

分布式的架构支持海量数据和无缝扩容

查询逻辑运算符
$Lt:存在并小于
$Lte:存在并小于等于
$gt:存在并大于
$gte:存在并大于等于
$ne:不存在或存在但不等于
$in:存在并在指定数组中
$nin:不存在或不在指定数组中
$or:匹配两个或多个条件中的一个
$and:匹配全部条件

使用insert完成插入操作
插入单条数据
db.<集合>.insertOne(<JSON对象>)
插入多条数据
db.<集合>.insertMany([,,])

实例
db.fruit.insertOne({name:“apple”})
db.fruit.insertMany(
{name:“apple”},
{name:“pear”},
{name:“orange”}
)

使用find查询文档

find是MongoDB中查询数据的基本指令,相当于SQL中的select。
find返回的是游标。

find实例
db.movies.find({“year”:1975})//单条件查询
db.movies.find({“year”:“1989”,“title”:“Batman”})//多条件查询
db.movies.find( a n d : [ " t i t l e " : " B a t m a n " , " c a t e g o r y " : " a c t i o n " ] ) / / a n d 的另一种形式 d b . m o v i e s . f i n d ( and:[{"title":"Batman"},{"category":"action"}])//and的另一种形式 db.movies.find( and:["title":"Batman","category":"action"])//and的另一种形式db.movies.find(or:[{“year”:“1989”},{“title”:“Batman”}])//多条件or查询
db.movies.find({“title”:/^B/})

查询条件对照表
SQL MQL
a=1 {a:1}
a<>1 {a:{KaTeX parse error: Expected 'EOF', got '}' at position 5: ne:1}̲} a>1 {a:{gt:1}}

查询逻辑对照表
a=1 and b=1 {a:1,b:1}

find支持使用“field.sub_field”的形式查询子文档。假设有一个文档:
db.fruit.insertOne({
name:“apple”,
from:{
country:“China”,
province:“Guangdon”
}
})
db.fruit.find({“from.country”:“China”})

使用find搜索数组中的对象
查询城市是Rome的记录
db.movies.find({“filming_locations.city”:“Rome”})

使用find搜索数组中的对象
在数组中搜索子对象的多个字段时,如果使用$elemMatch,它表示必须同一个子对象满足多个条件。
db.getCollection(‘movies’).find({
“filming_locations.city”:“Rome”,
“filming_locations.country”:“USA”
})

db.getCollection(‘movies’).find({
“filming_locations”:{
$elemMatch:{“city”:“Rome”,“country”:“USA”}
}
})

控制find返回的字段
find 可以指定只返回指定的字段;
_id字段必须明确指明不返回,否则默认返回;
在MongDB中我们称这为投影(projection);
db.movies.find({“category”:“action”},{“_id”:0,title:1}) 0不返回,1返回

使用remove删除文档
remove命令需要配合查询条件使用;
匹配查询条件的文档会被删除;
指定一个空文档条件会删除所有文档;
以下示例:
db.testcol.remove({a:1})//删除a等于1的记录
db.testcol.remove({a:{$lt:5}})//删除a小于5的记录
db.testcol.remove({})//删除所有记录
db.testcol.remove()//报错

使用update更新文档
Update操作执行格式:db.<集合>.update(<查询条件>,<更新字段>)
以下数据为例:
db.fruit.insertMany([
{name:“apple”},
{name:“pear”},
{name:“orange”}
])
db.fruit.updateOne({name:“apple”},{$set:{from:“China”}}) //查询name为apple的记录 将找到记录的from设置为China
使用updateOne表示无论条件匹配多少条记录,始终只更新第一条;
使用updateMany表示条件匹配多少条就更新多少条;
updateOne/updateMany方法要求更新条件部分必须具有以下之一,否则将报错:
s e t / set/ set/unset
p u s h / push/ push/pushAll/$pop
p u l l / pull/ pull/pullAll
$addToSet

报错
db.fruit.updateOne({name:“apple”},{from:“China”})

$push:增加一个对象到数组底部
$pushAll:增加多个对象到数组底部
$pop:从数组底部删除一个对象
$pull:如果匹配指定的值,从数组中删除相应的对象
$pullAll:如果匹配任意的值,从数据中删除相应的对象
$addToSet:如果不存在则增加一个值到数组

使用drop删除集合
使用db.<集合>.drop()来删除一个集合
集合中的全部文档都会被删除
集合相关的索引也会被删除
db.colToBeDropped.drop()

使用dropDatabase删除数据库
使用db.dropDatabase()来删除数据库
数据库相应文件也会被删除,磁盘空间将被释放

use tempDB
db.dropDatabase()
show collections
show dbs

mongo聚合操作

管道(Pipeline)和步骤(Stage)
整个聚合运算过程称为管道(Pipeline),它是由多个步骤(Stage)组成的
每个管道:
接受一系列文档(原始数据);
每个步骤对这些文档进行一系列运算;
结果文档输出给下一个步骤;

常见步骤
步骤 作用 sql等价运算符
$match 过滤 where
$project 投影 as
$sort 排序 order by
$group 分组 group by
s k i p / skip/ skip/limit 结果限制 skip/limit
$lookup 左外连接 left outer join

复制集的作用
MongoDB复制集的主要意义在于实现服务高可用。
它的实现依赖于两个方面的功能
数据写入时将数据迅速复制到另一个独立节点上
在接受写入的节点发生故障时自动选举出一个新的替代节点

在实现高可用的同时,复制集实现了其他几个附加作用
数据分发:将数据从一个区域复制到另一个区域,减少另一个区域的读延迟。
读写分离:不同类型的压力分别在不同的节点上执行。
异地容灾:在数据中心故障时候快速切换到异地。

典型的复制集结构
一个典型的复制集由3个以上具有投票权的节点组成,包括:
一个主节点(primary):接受写入操作和选举时投票
两个(或多个)从节点(secondary):复制主节点上的新数据和选举时投票
不推荐使用Arbiter(投票节点)

数据是如何复制的?
当一个修改操作,无论是插入、更新或删除,到达主节点时,他对数据的操作将被记录下来(经过一些必要的转换),这些记录称为oplog
从节点通过在主节点上打开一个tailable游标不断获取新进入主节点的oplog,并在自己的数据上回放,以此保持跟主节点的数据一致。

通过选举完成故障恢复
具有投票权的节点之间两两互相发送心跳;
当5次心跳未收到时判断为节点失联;
如果失联的是主节点,从节点会发起选举,选出新的主节点;
如果失联的是从节点则不会产生新的选举;
选举基于RAFT一致性算法实现,选举成功的必要条件是大多数投票节点存活;
复制集中最多可以有50个节点,但具有投票权的节点最多7个。

复制集节点有以下常见的选配项:
是否具有投票权(v参数):有则参与投票;
优先级(priority参数):优先级越高的节点越优先成为主节点。优先级为0的节点无法成为主节点。
隐藏(hidden参数):复制数据,但对应用不可见。隐藏节点可以具有投票权,但优先级必须为0。
延迟(slaveDelay参数):复制n秒之前的数据,保持与主节点的时间差。

复制集注意事项
关于硬件:
因为正常的复制集节点都有可能成为主节点,他们的地位是一样的,因此硬件配置上必须一致。
为了保证节点不会同时待机,各节点使用的硬件必须具有独立性。
关于软件
复制集各节点版本必须一致,以避免出现不可预知的问题。
增加节点不会增加系统写性能。

复制集实例
复制集的每个mongod进程应该位于不同的服务器,我们现在在一台机器上运行3个进程,因此要为他们各自配置:
不同的端口。示例中将使用28017/28018/28019
不同的数据目录。实例中将使用:
/data/db1或c:\data\db1
/data/db2或c:\data\db2
/data/db3或c:\data\db3

不同日志文件路径。实例中将使用:
/data/db1/mongod.log或c:\data\db1\mongod.log
/data/db2/mongod.log或c:\data\db2\mongod.log
/data/db3/mongod.log或c:\data\db3\mongod.log

配置复制集
方法1
#mongo–port 28017
rs.initiate()
rs.add(“HOSTNAME:28018”)
rs.add(“HOSTNAME:28019”)
注意此方法hostname需要能被解析

验证
MongoDB主节点进行写入
mongo localhost:28017
db.test.insert({a:1})
db.test.insert({a:2})

MongoDB从节点进行读
mongo localhost:28018
rs.slaveOk()
db.test.find()
db.test.find()

MongoDB全家桶
软件模块 描述
mongod MongoDB数据库软件
mongo MongoDB命令行工具,管理MongoDB数据库
Mongos MongoDB路由进程,分片环境下使用
mongoexport/mongorestore 命令行数据库备份与恢复工具
mongoexport/mongoimport csv/json导入导出,主要用于不同系统间数据库迁移
Compass mongodb GUI管理工具
OpsManager(企业版) Mongo集群管理软件
BI Connector(企业版) SQL解释器/BI套接件
MongoDB charts(企业版) MongDB可视化软件
Atlas-MongoDB 共有云托管服务

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值