mongodb基本命令,mongodb集群原理分析

集合:

1、集合没有固定数据格式。

2、

数据:

时间类型:

Date() 当前时间(js时间)

new Date() 格林尼治时间(object)

ISODate() 格林尼治时间(object)

转换:

new Date()/ISODate().toLocaleString() 转为本地时间Date()

new Date()/ISODate().valueOf() 转为时间戳

ID:

mongodb每个文档必须有一个_id键

默认_id = ObjectId()(对象)

命令:

数据库:

use db_n 使用库

db db_n 显示库名

show dbs 查看所有库

use database_name 删除库

->db.dropDatabase()

集合:

show collections 查看全部集合

db.createCollection("name", {options}) 创建集合

options:

capped 布尔 true固定集合,须指定size,默认false

size int 固定长度,超过后自动覆盖最早的文档,优先级大于max

autoIndexId 布尔 true自动在_id创建索引,默认true

max int 固定集合包含文档最大数量

db.c_n/db.getCollection("c_n") 使用集合

db.c_n.drop() 删除集合

固定集合:

db.createCollection("log",{capped: true, size: 10000, max: 5000}) 创建限制集合

db.isCapped() 是否为限制集合

db.runConmand({"convertToCapped": "mycoll", size: 100000}) 将集合转化为限制集

操作符:

$ 代表自己

文档:

pretty() 格式化读取

-------------------------------------------------------------------------------------------------------------------------

查询文档:

db.c_n.find({},{指定字段}) 查询文档 ({}中两个同名键,前面查询会被覆盖)

-----

db.c_n.find({},{aa:1,_id:0}) 指定aa字段,排除_id(_id默认会显示)

-----

aa:{$type:1} aa为数字类型

-----

aa: 1 aa = 1

aa:{$lt:50} aa<50

aa:{$lte:50} aa<=50

bb:{$gt:50} bb>50

bb:{$gte:50} bb>=50

bb:{$ne:50} bb!=50

aa:{$gte:10,$lte:20} 10<=aa<=20

aa:{$eq:20} aa=20

aa:{$in: [0,1,2,3] } aa in[]

aa:{$nin: [0,1,2,3] } aa not in[]

-----

$or:[{aa:1},{aa:2}] or

$and:[{},{}] and

$not:{$gt:2} not in (aa>2)

$nor:[] not or

$where:function(){

if(this.age>18){

return true;

}

return false;

}

/

$where:"this.age > 18" 自定义函数逻辑筛选

分页:

db.c_n.find().limit(2) 只查前2条

db.c_n.find().skip(2) 跳过前2条

排序:

db.c_n.find().sort({aa:1,bb:-1}) 排序,aa升序,bb降序

嵌套:

db.c_n.find({"aa.x":2}) 查询x符合的数据

一个:

db.c_n.findOne({}) 查询一个

正则:

aa:/你/ 包含 你

aa:/^你/ 以 你 开头

aa:/你$/ 以 你 结尾

游标:

var aa = db.c_n.find()

aa.hasNext()

aa.next()

-------------------------------------------------------------------------------------------------------------------------

插入文档:

db.c_n.insert(

[ {},{},{} ]/{} ,

{

writeConcern: <document> ,

ordered: <boolean>(是否按顺序插入,默认true顺序添加,出错后面无法添加/false不严格顺序,中间一条错误后面也能添加)

}

) 插入文档

db.c_n.insertOne({}) 插入一个文档

{ "acknowledged" : true, "insertedIds" : [ ObjectId("562a94d381cb9f1cd6eb0e1a"), ] } 返回值

db.c_n.insertMany(

[ {},{},{} ] ,

{

writeConcern: <document> ,

ordered: <boolean>(是否按顺序插入,默认true顺序添加,出错后面无法添加/false不严格顺序,中间一条错误后面也能添加)

}

) 批量(数组形式)添加

{

"acknowledged" : true,

"insertedIds" : [

ObjectId("5ccaa77a8467059db6186d23"),

ObjectId("5ccaa77a8467059db6186d24"),

ObjectId("5ccaa77a8467059db6186d25")

]

} 批量(数组形式)返回值

-------------------------------------------------------------------------------------------------------------------------

批量操作:

如果一个执行list 包含添加、更新 、删除操作 ,mongodb 会把操作分成三个组:第一个 执行insert 操作 第二个执行更新操作  第三个执行删除操作。

var bulk = db.test.initializeOrderedBulkOp();

bluk.insert();

bluk.update();

bluk.find({}).remove();

bluk.getOperations();(查看分组情况)

bluk.execute();(提交) 批量操作(指令)

返回: "batchType" : 1, //1 insert 2 update 3 remove

-------------------------------------------------------------------------------------------------------------------------

db.c_n.save({}) 插入(无_id)/修改(全部替换)

-------------------------------------------------------------------------------------------------------------------------

修改文档:

db.c_n.update(

{

<query>

},

{

<update>

},

{

upsert: <boolean>(不存在记录是否插入 false(默认)不插入/true插入),

multi: <boolean>(false(默认)更新第一条数据/true更新所有匹配数据),

writeConcern: <document>

}

) 修改文档字段

修改符号:

$inc:{aa: 1} 将aa加1

$set:{aa: 2} 把aa字段改为2

$unset:{cc: 1} 将cc字段删除

$push:{aa: 2} (数组)将2添加到aa数组,若不存在数组则自动创建

$pushAll:{aa:[c]} (数组)将c数组添加到aa数组后

$addToSet:{aa:2} (数组)将2添加到数组,2在数组不存在时才添加

$pop:{aa:-1/1} (数组)删除数组最前面、最后面的一个值

$pull:{aa:2} (数组)删除数组中为2的值

$pullAll:{aa:[1,2]} (数组)删除数组批量值

$rename:{old:new} 重命名键

-------------------------------------------------------------------------------------------------------------------------

删除文档:

db.c_n.remove(

{<query>},

{

justOne:<boolean>(是否删除首个 false(默认)否/true是),

writeConcern:<document>

}

) 删除文档

db.c_n.remove({}) 删除所有文档

-------------------------------------------------------------------------------------------------------------------------

类型筛选:

aa:{$type}

typeof 指定类型

-------------------------------------------------------------------------------------------------------------------------

索引:

db.c_n.createIndex(keys,options) 创建单个索引

db.c_n.createIndex({k1,k2,k3},{op}) 创建复合索引1

// db.c_n.ensureIndex({k1,k2,k3},{op}) 创建复合索引2(mongodb3.0开始废弃)

db.c_n.dropIndexes()/dropIndex("_name") 删除索引

db.c_n.getIndexes()/getIndex("_name") 查看索引

db.c_n.totalIndexSize() 索引大小

稀疏索引:

db.c_n.creatIndex({aaa:1},{name:"index1", sparse: true})

非阻塞建立索引:

db.c_n.creatIndex({},{background: true})

唯一索引:

db.c_n.creatIndex({},{unique: true})

TTL(只对时间类型有效):

db.createIndex({},{expireAfterSeconds: 60})

地理空间索引:

db.createIndex({"_name":"2d"})

数据结构:_name:{k1:120,k2:38} 或 _name:[120,38]

地理最近:

find({_name:{$near:[x,y]}}) (默认返回100个)

db.runCommand({geoNear:"c_n",near:[130,38],num:2}) (返回dis距离,stats状态)

*形状范围:

$within

内嵌文档:

db.c_n.createIndex("aaa.xxx",options)

索引排序:

若未对目标字段建立索引,mongodb将会把所有数据提取到内存进行排序,无索引排序使用个数限制的。

注意:

1、联合索引最左缀匹配原则,多条件查询有效。

2、单列多个索引只用到最左边那个。

-------------------------------------------------------------------------------------------------------------------------

统计函数:

db.runCommand({'distinct':'c_n','key':'fied','query':{}})

db.c_n.find({query}).limit(n).count(true/非0) 条件筛选后的数量

db.c_n.count({query}) 数量

db.c_n.distinct(“fied”,{query}) 去重

db.c_n.group({key,reduce,initial[,keyf][,cond][,finalize]}) 分组(最多返回20000个)

分组统计:https://blog.csdn.net/iteye_19607/article/details/82644559

db.c_n.group({

"key":{"k1":true}

"initial":{}

"$reduce":function(){

}

"condition":{query}

})

注意:

db.collection.group()使用JavaScript,它受到了一些性能上的限制。大多数情况下,$ group在Aggregation Pipeline提供了一种具有较少的限制适用的替代。可以通过指定的键的集合中的文档和执行简单的聚合函数

-------------------------------------------------------------------------------------------------------------------------

聚合查询:https://www.cnblogs.com/zhoujie/p/mongo1.html (结果限制大小16m)

db.c_n.aggregate([{ag1},{ag2}]) 聚合查询

$match:{query} 匹配条件

$sort:{aa:1/-1} 排序

$limit:10 输出条数

$skip:20 跳过条数

$unwind:"$aa" 将数组拆分

$out:"c_n" 将结果集迁移到c_n

$group *分组

$group:{_id:"$name",bbb:{$sum:1}}

_id:"$name" 指定分组字段,并以_id键返回数据

$sum 记录每组数据个数

-------------------------------------------------------------------------------------------------------------------------

结果重塑:

-------------------------------------------------------------------------------------------------------------------------

统计例子:

-------------------------------------------------------------------------------------------------------------------------

查询分析:

1、开启profile功能(慢查询记录):

db.getProfilingLevel() 返回level 值0关闭/1慢日志/2

db.setProfilingLevel(level,50(ms)) 记录大于50ms的日志

db.system.profile.find() 查询慢日志

-------------------------------------------------------------------------------------------------------------------------

mongo数据导入导出:

备份/恢复:mongodump/mongorestore

内存日志:journal:db文件下的journal目录

journalCommitInterval = 200 启动项配置journal刷新时间

导入/导出集合:mongoimport/mongoexport

-------------------------------------------------------------------------------------------------------------------------

mongodb集群:

0、副本集原理:

a.一个为主节点,其余的都为从节点。

b.主节点上能够完成读写操作,从节点仅能用于读操作。

c.同步:

(1)第一次启动,删除除了local以外的库,数据全量同步。

(2)同步后,各个从节点通过主节点oplog来复制数据并应用于本地。

(3)宕机或者oplog操作大于一轮未同步,数据全量同步。

(4)从节点通过检查本地oplog最新点和主节点最久点作比较,同步操作。

(5)oplogSize设置较大值避免全量同步。

d.主节点需要记录所有曾删改操作,这些记录保存在local库的oplog文件。

e.oplog:包括:ts时间、op操作类型、ns集合、o文档

(1)oplog为固定集合,超过oplogSize旧值会被覆盖。

(2)oplog 具有幂等性,即无论执行几次其结果一致(例如多次增加)。

(3)oplog包含一个递增的序号来记录操作的时效性。

f.集群中的各节点还会通过传递心跳(默认2s)信息来检测各自的健康状况。

g.主节点选举:

(1)投票,优先级最高的(优先级相同时数据最新的)为主节点。

(2)主节点通过心跳判断集群中多少节点对其可见,小于一半时降级。

(4)选举成功后集群以主节点oplog为最新数据,其他节点的操作都会回

滚,所有节点连接新的活跃节点后要重新同步。这些节点会查看自己的

oplog,找出其中活跃节点没有执行过的操作,然后向活跃节点请求这些操

作影响的文档的最新副本。正在执行重新同步的节点被视为恢复中,在完

成这个过程前,不能成为活跃节点候选者。

(3)参与选举节点数必须大于副本总节点数的一半,如果小于一半则所有

节点变成只读状态。

h.推荐MongoDB副本节点最少为3台,建议副本集成员为奇数,最多12个副

本节点,最多7个节点参与选举,过多时会增加复制压力。

i.所有的Secondary都宕机了,只剩下Primary。最后Primary会变Secondary,

不能提供服务。

1、副本集群管理:

rs.:副本命令,是replSet是缩写,代表副本集。

config={"_id":"shard1", "members":[

{"_id":1,"host":"120.77.37.94:27017","priority":1}

,{"_id": 2,"host":"47.107.174.213:27017","priority":2}

,{"_id": 3,"host":"132.232.156.103:27017","arbiterOnly":true(只作为仲裁节点)}] }

rs.initiate(config)

rs.status() //查看成员的运行状态等信息

rs.config() //查看配置信息

*rs.slaveOk() //允许在SECONDARY节点上进行查询操作,默认从节点不具有查询

功能

rs.isMaster() //查询该节点是否是主节点

rs.add({"ip:port"}) //添加新的节点到该副本集中

rs.remove({"ip:port"}) //从副本集中删除节点

2、主从复制:

--only             从节点指定复制某个数据库,默认是复制全部数据库

--slavedelay       从节点设置主数据库同步数据的延迟(单位是秒)

--fastsync         从节点以主数据库的节点快照为节点启动从数据库

--autoresync       从节点如果不同步则从新同步数据库(即选择当通过热添加了一台从服务器之后,从服务器选择是否更新主服务器之间的数据)

--oplogSize        主节点设置oplog的大小(主节点操作记录存储到local的oplog中)

主节点:

master=true #开启主节点

从节点:

slave=true #开启从节点

source 120.77.37.94:27017 #指定主节点

*shell添加主节点:

use local

db.sourse.insert({"host","120.222.222.22"})

*shell删除主节点:

db.sourse.remove({"host","120.222.222.22"})

3、切片集群:http://www.lanceyan.com/tech/arch/mongodb_shard1.html

注:切片权限和副本集权限是分开管理的。

-------------------------------------------------------------------------------------------------------------------------

mongodb引擎:mongod  --storageEngine mmapv1

1、wiredTiger引擎:3.0新增,3.2之后默认引擎。官方宣称在read、insert和复杂的

update下具有更高的性能。

(1)所有的write请求都基于“文档级别”的lock。

(2)通过在配置文件中指定“cacheSizeGB”参数设定引擎使用的内存量,此内存用于

缓存工作集数据(索引、namespace,未提交的write,query缓冲等)。

(3)wiredTiger每隔60秒(默认)或者待写入的数据达到2G时,将内存中的数据变更

flush到磁盘中的数据文件中,并做一个标记点。

(4)对于write操作,首先被持久写入journal,然后在内存中保存变更数据。journal日

志默认每个100毫秒同步磁盘一次,每100M数据生成一个新的journal文件,journal

默认使用了snappy压缩,检测点创建后,此前的journal日志即可清除。

2、MMAPv1引擎:

(1)所有的write请求都基于“collection”的lock。

(2)将数据文件映射到内存中。

-------------------------------------------------------------------------------------------------------------------------

mongodb版本:

3.2联合查询 look up / mongoose

4.0多文档事物 http://www.mongoing.com/archives/5560

mongodb基本命令,mongodb集群原理分析的更多相关文章

  1. Hazelcast集群原理分析

    简介 hazelcast其中一个很重要的应用就是可以将多个应用服务器组成一个分布式环境的应用,形成一个cluster.这个cluster可以选举出一个master来对外工作.而cluster中的各台服 ...

  2. HDFS的HA集群原理分析

    1.简单hdfs集群中存在的问题 不能存在两个NameNode 单节点问题   单节点故障转移 2.解决单节点问题 找额外一个NameNode备份原有的数据 会出现脑裂 脑裂:一个集群中多个管理者数据 ...

  3. Quartz应用与集群原理分析

    Quartz在CRM中的应用场景: https://tech.meituan.com/mt-crm-quartz.html https://www.mtyun.com/library/mt-crm-q ...

  4. 【MongoDB】在windows平台下mongodb的分片集群(五)

    本篇接着上面的四篇继续讲述在window平台下mongodb的分片集群搭建. 在分片集群中也照样能够创建索引,创建索引的方式与在单独数据库中创建索引的方式一样.因此这不再多说.本篇主要聚焦在分片键的选 ...

  5. MongoDB之分片集群与复制集

    分片集群 1.1.概念 分片集群是将数据存储在多台机器上的操作,主要由查询路由mongos.分片.配置服务器组成. ●查询路由根据配置服务器上的元数据将请求分发到相应的分片上,本身不存储集群的元数据, ...

  6. 搭建一个分布式MongoDB鉴权集群

    今天休假在家,测试并搭建了一个replica set shard MongoDB鉴权集群.replica set shard 鉴权集群中文资料比较少,本文是个人笔记,同时也希望对后来者有所帮助.本文仅 ...

  7. (转)MongoDB分片实战 集群搭建

    环境准备 Linux环境 主机 OS 备注 192.168.32.13 CentOS6.3 64位 普通PC 192.168.71.43 CentOS6.2 64位 服务器,NUMA CPU架构 Mo ...

  8. mongodb 3.4 集群搭建升级版 五台集群

    最新版mongodb推荐使用yaml语法来做配置,另外一些旧的配置在最新版本中已经不在生效,所以我们在生产实际搭建mongodb集群的时候做了一些改进.如果大家不熟悉什么是分片.副本集.仲裁者的话请先 ...

  9. mongodb 3.4 集群搭建:分片+副本集

    mongodb是最常用的nodql数据库,在数据库排名中已经上升到了前六.这篇文章介绍如何搭建高可用的mongodb(分片+副本)集群. 在搭建集群之前,需要首先了解几个概念:路由,分片.副本集.配置 ...

随机推荐

  1. Web前端安全之利用Flash进行csrf攻击

    整理于<XSS跨站脚本攻击剖析与防御>—第6章 Flash在客户端提供了两个控制属性: allowScriptAccess属性和allowNetworking属性,其中AllowScrip ...

  2. Git上传项目至GitHub

    要使用github,首先需要下载git.安装git 1.先在github上创建一个git仓库,复制该github路径 2.用cmd进入一个目录 git clone github路径 从github上直 ...

  3. Kubernetes的Service运行原理

    一.为什么Servcie能定位到Pod 因为Pod的IP是不固定的,所以Kubernetes需要Service,除此之外它还可以在多个Pod间负载均衡 Service的访问入口,其实是宿主机的kube ...

  4. vue——同一局域网内访问项目

    1.想要在手机上访问本地的vue项目,首先要保证手机和电脑处在同一局域网内(连着同一个无线网) 2.将你电脑的ip设置为固定ip(ipconfig查找本地的ip,然后修改它,改为你想变的数字) 3.在 ...

  5. 5.Linux文件管理相关命令(下)

    1.文件管理之:联网下载文件(wget.curl).文件上传与下载(rz.sz) 1.wget命令 1.CentOS7 系统最小化安装默认没有wget命令,需要进行安装 [root@oldboyedu ...

  6. EFK教程 - EFK快速入门指南

    通过部署elasticsearch(三节点)+filebeat+kibana快速入门EFK,并搭建起可用的demo环境测试效果 作者:"发颠的小狼",欢迎转载与投稿 目录 ▪ 用途 ...

  7. 数据结构(四十七)归并排序(O(nlogn))

    一.归并排序的定义 归并排序(Merging Sort)就是利用归并的思想实现的排序方法.它的原理是假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到[n ...

  8. TCP/IP和Socket开发经验分享

    当前与网络相关的业务主要是基于tcp/ip或http,熟悉j2ee的同学一定会对http场景下的开发比较了解.但是,精通tcp/ip以及如何构建一个直接基于tcp/ip层通讯的知识却不太多见.恰巧,最 ...

  9. GUI编程(Tkinter) 笔记分享

    Python GUI编程(Tkinter) Python 提供了多个图形开发界面的库,几个常用 Python GUI 库如下: Tkinter: Tkinter 模块(Tk 接口)是 Python 的 ...

  10. SpringBoot + Redis 执行lua脚本

    1.背景 有时候,我们需要一次性操作多个 Redis 命令,但是 这样的多个操作不具备原子性,而且 Redis 的事务也不够强大,不支持事务的回滚,还无法实现命令之间的逻辑关系计算.所以,一般在开发中 ...