MongoDB学习

1.MongoDB的下载与安装

  www.mongodb.org 

groupadd -g 27017 mongod 
useradd -g 27017 -u 27017 mongod
mkdir -p /data/db
chown -R mongod.mongod data

2.MongoDB的操作

db  #查看当前数据库
use db_name  #使用数据库
show collections;  #查看表的数据
db.getCollectionNames()  #获取数据库中所有表的数据
db.mycoll.help();  #查询对相应表的一些操作
db.tables1.insert({name:"tom",age:"20",address:{add1:"hebei",add2:"wuhan"}});  #新建一张tables1表,并且插入相应的数值
db.mycoll.find().help();  #查询的方法,排序,最大最小等...
db.tables1.find();  #查看collection tables1的内容
for (i=0;i<1000;i++) db.tables1.insert({name:"Alex"+i});  #向collection tables1中插入1000条数据

db.find()的操作
条件操作
db.mytb1.find({"name":"Alex210"},{"name":1,"age":1,"addr":1}); { "_id" : ObjectId("58bf55e7a0ea941cdc1c6355"), "name" : "Alex210", "age" : 10.5, "addr" : "ShenZhen" }

等价于
select name,age,addr from mytb1 where name="Alex210"
AND操作
db.mytb1.find({"name":"Alex19","age":0.95},{"name":1,"age":1,"addr":1});
等价于
select name,age,addr from mytb1 where name="Alex19" and age="0.95"
OR操作
db.mytb1.find({'$or':[{"name":"Alex19"},{"age":1}]},{"name":1,"age":1,"addr":1});
等价于
select name,age,addr from mytb1 where name="Alex19" or age="1"
比较操作
db.mytb1.find({age:{$gt:10}});
<, <=, >, >= ($lt, $lte, $gt, $gte )
IN操作
db.mytb1.find({"age":{"$in":[10,20,30]}});
等价于
select * from mytb1 where age in (10,20,30)
NIN
db.mytb1.find({"age":{"$nin":[10,20,30]}});
等价于
select * from mytb1 where age not in(10,20,30)
NULL操作
db.mytb1.find({"age":null});
等价于
select * from mytb1 where age is null
LIKE操作
db.mytb1.find({name:/^Alex/});
等价于
select * from mytb1 where name like "Alex%"
DISTINCT操作
db.mytb1.distinct('name');
等价于
select distinct(name) from mytb1
COUNT操作
db.mytb1.find({"age":{"$in":[10,20,30]}}).count();
等价于
select count(*) from mytb1 where age in (10,20,30)
MongoDB可以做数组的操作
EXISTS操作
db.mytb1.find({"age": {$exists:false}});
如果mytb1里面不存在age字段的row打印出来
类型对应数字别名说明
Double11double 
String2string 
Object3object 
Array4array 
Binary data5binData 
Undefined6undefined弃用
ObjectId7objectId 
Boolean8“bool” 
Date9“date” 
Null10“null” 
Regular Expression11“regex” 
DBPointer12“dbPointer” 
JavaScript13“javascript” 
Symbol14“symbol” 
JavaScript(with scope)15“javascriptWithScope” 
32-bit integer16“int” 
Timestamp17“timestamp” 
64-bit integer18“long” 
Min key-1“minKey” 
Max key127“maxKey” 
TYPE类型查询
db.mytb1.find({"age":{$type:1}});
UPDATE操作
db.mytb1.update({name:"Alex19"},{$set:{age:"99"}});

UPDATE更新多条记录

 db.mytb1.update({name:”Alex19″},{$set:{age:”88″}},false,true);

 db.table_name.update(where,setNew,issert,multi );

  参数解释:
  where:类似于sql中的update 语句where后边的查询条件

  setNew:类似于sql中update语句中set后边的部分,也就是你要更新的部分

  upsert:如果要更新的那条记录没有找到,是否插入一条新纪录,默认为false不插入,true为插入

  multi :是否更新满足条件的多条的记录,false:只更新第一条,true:更新多条,默认为false

UNSET操作
db.mytb1.update({name:"Alex20"},{$unset:{"age":1}});
删除age这个字段

SET操作

 db.mytb1.update({name:”Alex20″},{$set:{“sex”:”girl”}});

 增加sex这个字段

REMOVE操作
db.mytb1.remove({name:"Alex20"});
删除name="Alex20"的这条记录

 索引操作

db.tables1.getIndexes();
获取索引
创建索引
> db.tables1.createIndex({name:1});
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
}
添加索引以后查询的速度快了很多。

 

 

MongoDB:
NoSQL、文档存储、JSON/BSON

groupadd -g 27017 mongod
useradd -g 27017 -u 27017 mongod

索引分类:
单键索引
组合索引(多字段索引)
多建索引:索引是创建在键值是子文档的索引

mongod –help
fork: mongod是否运行在后台
bind_ip: 启动以后的运行地址,默认为127.0.0.1
port: 监听端口,默认为27017
maxConns: 并发最大连接数
repair: 进程意外,启动需要修复数据库

MongoDB的复制功能:
两种类型:
master/slave
replica set: 复制集
主节点将数据修改操作保存至oplog中
arbiter: 仲裁节点

复制集中的节点分类:
0优先级的节点: 冷备节点,不会被选举成为主节点,但是可以参与选举
被隐藏的从节点:首先必须是0优先级的节点,其次不会被客户端访问,但可以参与选举
延迟复制的从节点:首先必须是0优先级的节点,且复制时间落后于主节点一个固定时长,但可以参与选举
arbiter: 仲裁节点

MongoDB的复制架构:
oplog: 大小固定的文件,存储在local数据库中
初始同步(initial sync)
回滚后追赶(post-rollback catch-up)
切分块迁移(sharding chunk migrations)
heartbeat

MongoDB的数据同步类型:
初始同步:
从节点没有任何数据
从节点丢失副本复制历史

初始同步的步骤:
1、克隆所有数据库的所有collections
2、应用数据集的所有改变:复制oplog并应用在本地
3、为所有collection构建索引

oplog是用于实现replication的,而journal是用于实现redo的log
复制

rs.add()报错,没有关闭防火墙

testSet:PRIMARY> rs.add(“192.168.144.47”)
{
“ok” : 0,
“errmsg” : “Quorum check failed because not enough voting nodes responded; required 2 but only the following 1 voting nodes responded: docker46:27017; the following nodes did not respond affirmatively: 192.168.144.47:27017 failed with No route to host”,
“code” : 74,
“codeName” : “NodeNotFound”
}
systemctl stop firewalld
systemctl disable firewalld

创建复制集,创建指定的配置文件,启动的时候指定配置文件启动

# 日志文件位置
logpath=/data/mongo/mongo.log

bind_ip=127.0.0.1,192.168.144.46

# 以追加方式写入日志
logappend=true

# 是否以守护进程方式运行
fork = true

# 默认27017
#port = 27017

# 数据库文件位置
dbpath=/data/mongo

# 启用定期记录CPU利用率和 I/O 等待
#cpu = true

# 是否以安全认证方式运行,默认是不认证的非安全方式
#noauth = true
#auth = true

# 详细记录输出
#verbose = true

# Inspect all client data for validity on receipt (useful for
# developing drivers)用于开发驱动程序时验证客户端请求
#objcheck = true

# Enable db quota management
# 启用数据库配额管理
#quota = true
# 设置oplog记录等级
# Set oplogging level where n is
#   0=off (default)
#   1=W
#   2=R
#   3=both
#   7=W+some reads
#diaglog=0

# Diagnostic/debugging option 动态调试项
#nocursors = true

# Ignore query hints 忽略查询提示
#nohints = true
# 禁用http界面,默认为localhost:28017
#nohttpinterface = true

# 关闭服务器端脚本,这将极大的限制功能
# Turns off server-side scripting.  This will result in greatly limited
# functionality
#noscripting = true
# 关闭扫描表,任何查询将会是扫描失败
# Turns off table scans.  Any query that would do a table scan fails.
#notablescan = true
# 关闭数据文件预分配
# Disable data file preallocation.
#noprealloc = true
# 为新数据库指定.ns文件的大小,单位:MB
# Specify .ns file size for new databases.
# nssize = 

# Replication Options 复制选项
# in replicated mongo databases, specify the replica set name here
replSet=testSet replIndexPrefetch=_id_only
# maximum size in megabytes for replication operation log
#oplogSize=1024
# path to a key file storing authentication info for connections
# between replica set members
#指定存储身份验证信息的密钥文件的路径
#keyFile=/path/to/keyfile

MongoDB:
NoSQL、文档存储、JSON/BSON

groupadd -g 27017 mongod
useradd -g 27017 -u 27017 mongod

索引分类:
单键索引
组合索引(多字段索引)
多建索引:索引是创建在键值是子文档的索引

mongod –help
fork: mongod是否运行在后台
bind_ip: 启动以后的运行地址,默认为127.0.0.1
port: 监听端口,默认为27017
maxConns: 并发最大连接数
repair: 进程意外,启动需要修复数据库

MongoDB的复制功能:
两种类型:
master/slave
replica set: 复制集
主节点将数据修改操作保存至oplog中
arbiter: 仲裁节点

复制集中的节点分类:
0优先级的节点: 冷备节点,不会被选举成为主节点,但是可以参与选举
被隐藏的从节点:首先必须是0优先级的节点,其次不会被客户端访问,但可以参与选举
延迟复制的从节点:首先必须是0优先级的节点,且复制时间落后于主节点一个固定时长,但可以参与选举
arbiter: 仲裁节点

MongoDB的复制架构:
oplog: 大小固定的文件,存储在local数据库中
初始同步(initial sync)
回滚后追赶(post-rollback catch-up)
切分块迁移(sharding chunk migrations)
heartbeat

MongoDB的数据同步类型:
初始同步:
从节点没有任何数据
从节点丢失副本复制历史

初始同步的步骤:
1、克隆所有数据库的所有collections
2、应用数据集的所有改变:复制oplog并应用在本地
3、为所有collection构建索引

oplog是用于实现replication的,而journal是用于实现redo的log
复制

rs.add()报错,没有关闭防火墙

testSet:PRIMARY> rs.add(“192.168.144.47”)
{
“ok” : 0,
“errmsg” : “Quorum check failed because not enough voting nodes responded; required 2 but only the following 1 voting nodes responded: docker46:27017; the following nodes did not respond affirmatively: 192.168.144.47:27017 failed with No route to host”,
“code” : 74,
“codeName” : “NodeNotFound”
}
systemctl stop firewalld
systemctl disable firewalld

“stateStr” : “(not reachable/healthy)”,节点状态不对,也是防火墙的问题

在56上
> rs.status()
{
“info” : “run rs.initiate(…) if not yet done for the set”,
“ok” : 0,
“errmsg” : “no replset config has been received”,
“code” : 94,
“codeName” : “NotYetInitialized”
}
>
> rs.initiate()
{
“info2” : “no configuration specified. Using a default configuration for the set”,
“me” : “192.168.144.56:27017”,
“ok” : 1
}

testSet:PRIMARY> rs.add(“192.168.144.46”);
{ “ok” : 1 }
testSet:PRIMARY> rs.add(“192.168.144.47”);
{ “ok” : 1 }

testSet:SECONDARY> show dbs
2017-03-15T06:48:43.988-0400 E QUERY [thread1] Error: listDatabases failed:{
“ok” : 0,
“errmsg” : “not master and slaveOk=false”,
“code” : 13435,
“codeName” : “NotMasterNoSlaveOk”
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
Mongo.prototype.getDBs@src/mongo/shell/mongo.js:62:1
shellHelper.show@src/mongo/shell/utils.js:755:19
shellHelper@src/mongo/shell/utils.js:645:15

手工将Primary设置为Secondary,执行stepDown()

对于副本集的重新选举的影响条件:
心跳信息
优先级
optime:optime必须是最新的,不能落后于其他节点
网络连接
网络分区

选举机制:
出发选举的事件:
新副本集初始化时
从节点联系不到主节点时
主节点“下台”时:主几点收到stepDown()/某从节点有更高的优先级,且已经满足成为主节点的其他所有条件
主节点无法联系到副本集的“多数方”

设置节点的优先级:
只能在主节点上执行命令
cfg=rs.conf()
cfg.members[2].priority=2
rs.reconfig(cfg);

MongoDB的分片:
MySQL分片:Gizzard,HiveDB,MySQL+HScale,Hibernate Shard

分片架构中的角色:
mongos: Router
config: 元数据服务器
shard:数据节点,也称mongod实例节点

基于范围切片:range
基于列表切片:list
基于HASH切片:

添加mongodb的启动停止脚本

cd /etc/init.d/
[root@docker46 init.d]# cat mongodb #!/bin/bash # #chkconfig: 2345 80 90 #description: mongodb start() { su - mongod -c "/data/mongodb/bin/mongod -f /data/mongo/mongodb.cnf" } stop() { su - mongod -c "/data/mongodb/bin/mongod -f /data/mongo/mongodb.cnf --shutdown" } case "$1" in start) start ;; stop) stop ;; restart) stop start ;; *) echo $"Usage: $0 {start|stop|restart}" exit 1 esac

chkconfig --add mongodb
chmod +x  mongodb
chkconfig mongodb on

 

 

 

 

 

 

 

  

    原文作者:MongoDB
    原文地址: https://www.cnblogs.com/python-study/p/6543527.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞