MongoDB 安装学习笔记

MongoDB 安装

1、下载安装包:安装包下载:https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.0.tgz

# 2、解压,编辑环境变量
tar zxvf mongodb-linux-x86_64-4.0.0.tgz
mv mongodb-linux-x86_64-4.0.0 mongodb
 
vim /etc/profile
export PATH=/usr/mongodb/bin:$PATH
source /etc/profile

# 3、创建mongoDB 文件
cd /usr/mongodb
touch mongodb.conf
mkdir db
mkdir log
cd log
touch mongodb.log

# 编辑配置
vim /usr/mongodb/mongodb.conf

添加以下内容

port=27017 #端口
dbpath= /usr/mongodb/db #数据库存文件存放目录
logpath= /usr/mongodb/log/mongodb.log #日志文件存放路径
logappend=true #使用追加的方式写日志
fork=true #以守护进程的方式运行,创建服务器进程
maxConns=100 #最大同时连接数
noauth=true #不启用验证
journal=true #每次写入会记录一条操作日志(通过journal可以重新构造出写入的数据)。
#即使宕机,启动时wiredtiger会先将数据恢复到最近一次的checkpoint点,然后重放后续的journal日志来恢复。
storageEngine=wiredTiger  #存储引擎有mmapv1、wiretiger、mongorocks
bind_ip = 0.0.0.0  #这样就可外部访问了,例如从win10中去连虚拟机中的MongoDB
# 授权文件夹
cd /usr/mongodb
chmod 777 db
chmod 777 log
# 启动
mongod --config /usr/mongodb/mongodb.conf
MongoDB web界面

MongoDB 提供了简单的 HTTP 用户界面。 如果你想启用该功能,需要在启动的时候指定参数 --rest 。
注意:该功能只适用于 MongoDB 3.2 及之前的早期版本

$ ./mongod --dbpath=/data/db --rest

MongoDB 的 Web 界面访问端口比服务的端口多1000。

如果你的MongoDB运行端口使用默认的27017,你可以在端口号为28017访问web用户界面,即地址为:http://localhost:28017。
###2、 MongoDB 指令
进入MongoDB安装目录/bin

  • 启动数据库 ./mongod --dbpath=/data/db

  • 进入数据库 ./mongo

  • show dbs 查看数据库

  • use [dbname] 使用数据库,没有数据库时,创建该数据库(如果不进行数据操作则不创建)

  • show collections 查看集合

  • db.collection.find() 查询集合中的数据 – find({'name':'panlei'}) 条件查询
    find().count()集合总数
    find().skip(3).limit(2).sort({'id':1}) 跳过3条,限制2条,根据id排序

  • 更新操作
    db.collection.update({'id':'1'},{'id':'2'}) 更新操作
    前面为条件, 默认情况下,后面为全部替换
    update({'id':'1'},{$set:{'id':'22'}}) KaTeX parse error: Expected '}', got 'EOF' at end of input: …te({'id':'1'},{set:{‘id’:‘22’}},ture)有就更新,没有就插入 **注意:更新操作默认更新第一条符合条件的记录** 更新全部符合条件的数据时:update({‘id’:‘1’},{$set:{‘id’:‘22’}},false,true)`

  • 删除数据
    remove() 方法
    db.collection.drop() 删除集合

  • 索引
    db.collection.getIndexes() 查看集合中索引情况
    db.collection.ensureIndex({'name':1}) 创建索引 1:正向 2:逆向
    db.collection.ensureIndex({'title':1},{'name':'title_index'}) 创建索引,并命名
    db.collection.dropIndex("title_index") 删除索引
    db.collection.ensureIndex({'name':1,'y':1}) 复合索引
    db.collection.ensureIndex({'name':1},{expireAfterSeconds:10}) 过期索引

  • 过期索引表示数据在一段时间后过期,数据类型必须为ISODate 或ISODate数组, 该字段的时间过期,表示整条数据都会消失

  • 过期时间索引不能是复合索引

  • 如果过期时间索引是时间数组,则按照最小时间(最早达成条件)

  • 删除时间不是精确的

db.collection.ensureIndex({'name':'text','y':'text'}) 创建全文索引
db.collection.ensureIndex({'$**':'text'}) 为集合中所有字段添加全文索引
db.collection.find({$text:{$search:'panlei'}}) 使用全文索引查询
db.collection.find({$text:{$search:['aa bb cc']}}) 或查询
db.collection.find({$text:{$search:['aa bb -cc']}}) 不包含cc 的
db.news.find({$text:{$search:"\"wangyan\" \"wangying\""}}) 与查询(不可用单引号)
db.collections.find({$text:{$search:"wangyan"}},{"score":{$meta:"textScore"}}).sort({$meta:"textScore"}) 根据相似度查询

db.collection.ensureIndex({},{'unique':true}) 创建唯一索引
db.collection.ensureIndex({},{'sparse':true}) 创建稀疏索引
默认是false, 当不存在key 时也会重建索引
注意: 当强制使用稀疏索引判断key 是否存在时会出现异常数据
比如 db.collection.find({'title':{$exists:false}}).hint("index")

地理位置索引
db.locations.ensureIndex({"position":"2d"}) 创建2d索引
经纬度:[经度,纬度]
db.locations.find({'position':{$near:[1,1]}}) 找出附近的100个点
db.locations.find({'position':{$near:[1,1],$maxDistance:10}}) 查找距离小于10的点

在这里插入图片描述
在这里插入图片描述

mongoDB 索引讲解

// 为number 创建索引
db.books.ensureIndex({number:1});

// 插入20万条数据
for(var i =0;i<200000;i++){
	db.books.insert({number:i,book:'book_'+i});
}

// 查询时间
var start = new Date();
db.books.find({number:13290});
var end = new Date();
end -start;
//不加索引72毫秒

为number 创建索引
db.books.ensureIndex({number:1}); // 1:正序索引 -1:倒叙索引
建立索引之后, 速度仅为1毫秒

db.books.ensureIndex({number:-1},{unique:true});建立唯一索引

db.books.find({name:'1book',number:1}).hint({name:-1});强制查询使用指定索引

db.books.find({name:'1book',number:1}).explain();调出查询信息:包括索引 条数 执行时间

db.runCommand({dropIndexes:'books',index:"name_-1"})删除索引

固定集合:
1、固定集合默认没有索引
2、由于不需要分配新的空间,他插入的速度非常快
3、固定集合的顺是确定的,导致查询速度是非常快的
4、最适合的应用是日志管理

创建固定集合
1、创建一个新的固定集合,大小100个字节, 可以存储是10个文件

db.createCollection("books",{size:100,capped:true,max:10});

2、把普通集合转换为固定集合

db.runCommand({convertToCapped:"persons",size:10000});

3、反向排序,默认是插入顺序排序

db.books.find().sort({$natural:-1});

GridFS mongoDB自带的文件系统, 它使用二进制形式存储文件, mongofiles.exe
1、 mongofiles -d books -l "/home/test.log" put "a.txt" 上传文件

2、集合文件查看

db.fs.chunks.find();
db.fs.files.find();

3、查看所有文件的集合

mongofiles -d books list

4、删除已经存在的文件

mongofiles -d foobar delete "a.txt"

Eval

1、服务器端运行eval

db.eval("function(name){return name}","aspcat");

2、在服务器上保存JS变量为函数供全局调用

db.system.js.insert({id:name,value:"uspcat"});
调用:`db.eval("return name");`

导出数据:
1、mongoexport -d books -c books -o /usr/local/book.json

mongoexport
	-d [库名]
	-c [集合名车-books]
	-o [导出的文件名和目录]
	--type[json|csv|tsv]
	
导出其他主机的文档: mongoexport --host 192.168.0.1 --port 37017

2、导入

	mongoimport --db books --collection books --file /usr/local/book.json 导出(中断其他操作)

3、 运行时备份
mongodump --host 127.0.0.1:27017 -d books -o /usr/local/books 导出指定服务下的foobar数据库(可能会遗漏内存中的数据)

4、 运行时恢复

	db.dropDatabase();
	mongorestore --host 127.0.0.1:27017 -d foobar -directoryperdb /usr/local/books
	mongorestore -d [your_db_name] [your_dump_dir] 
	mongorestore c:/hw1-1/dump 

5、db.repartDatabase(); 修复数据

主从复制:
主: master:true
从:slave:true
source: 主机IP:Port

动态设置主从复制
	use local;
	db.sources.find(); // 查询可用的主从复制
	db.sources.insert({"host":"127.0.0.1"}); // 动态设置主从复制
	db.sources.remove({"host":"127.0.0.1"}); // 删除主从复制

3、MongoDB 监控

使用mongostat 效果验证 ./mongostat -h 127.0.0.1:27017
这里写图片描述
各字段解释说明:
insert/s : 官方解释是每秒插入数据库的对象数量,如果是slave,则数值前有*,则表示复制集操作
query/s : 每秒的查询操作次数
update/s : 每秒的更新操作次数
delete/s : 每秒的删除操作次数
getmore/s: 每秒查询cursor(游标)时的getmore操作数
command: 每秒执行的命令数,在主从系统中会显示两个值(例如 3|0),分表代表 本地|复制 命令
注: 一秒内执行的命令数比如批量插入,只认为是一条命令(所以意义应该不大)
dirty: 仅仅针对WiredTiger引擎,官网解释是脏数据字节的缓存百分比
used:仅仅针对WiredTiger引擎,官网解释是正在使用中的缓存百分比
flushes:
For WiredTiger引擎:指checkpoint的触发次数在一个轮询间隔期间
For MMAPv1 引擎:每秒执行fsync将数据写入硬盘的次数
注:一般都是0,间断性会是1, 通过计算两个1之间的间隔时间,可以大致了解多长时间flush一次。flush开销是很大的,如果频繁的flush,可能就要找找原因了
vsize: 虚拟内存使用量,单位MB (这是 在mongostat 最后一次调用的总数据)
res: 物理内存使用量,单位MB (这是 在mongostat 最后一次调用的总数据)
注:这个和你用top看到的一样, vsize一般不会有大的变动, res会慢慢的上升,如果res经常突然下降,去查查是否有别的程序狂吃内存

qr: 客户端等待从MongoDB实例读数据的队列长度
qw:客户端等待从MongoDB实例写入数据的队列长度
ar: 执行读操作的活跃客户端数量
aw: 执行写操作的活客户端数量
注:如果这两个数值很大,那么就是DB被堵住了,DB的处理速度不及请求速度。看看是否有开销很大的慢查询。如果查询一切正常,确实是负载很大,就需要加机器了
netIn:MongoDB实例的网络进流量
netOut:MongoDB实例的网络出流量
注:此两项字段表名网络带宽压力,一般情况下,不会成为瓶颈
conn: 打开连接的总数,是qr,qw,ar,aw的总和
注:MongoDB为每一个连接创建一个线程,线程的创建与释放也会有开销,所以尽量要适当配置连接数的启动参数,maxIncomingConnections,阿里工程师建议在5000以下,基本满足多数场景

在每个find()查询后面添加explain() 获取查询详细信息参数

4、MongoDB 安全

mongodb 守护进程方式关闭

ps -ef|grep mongod|grep 27017
root       5435   4914  1 19:13 pts/2    00:00:14 mongod --dbpath=/data/mongodata/rs1 --logpath=/data/mongodata/rs1/rs1.log

kill -2 5435

mongod.conf 配置文件

# mongodb.conf

# Where to store the data.
dbpath=/var/lib/mongodb

#where to log
logpath=/var/log/mongodb/mongodb.log

logappend=true

bind_ip = 127.0.0.1
port = 27017

# Enable journaling, http://www.mongodb.org/display/DOCS/Journaling
journal=true

# Enables periodic logging of CPU utilization and I/O wait
#cpu = true

# Turn on/off security.  Off is currently the default
#noauth = true
#auth = true
# Verbose logging output.
#verbose = true

# Inspect all client data for validity on receipt (useful for
# developing drivers)
#objcheck = true

# Enable db quota management
#quota = true

# Set oplogging level where n is
#   0=off (default)
#   1=W
#   2=R
#   3=both
#   7=W+some reads
#oplog = 0
# Diagnostic/debugging option
#nocursors = true

# Ignore query hints
#nohints = true

# Disable the HTTP interface (Defaults to localhost:27018).
#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

# Specify .ns file size for new databases.
# nssize = <size>
# Accout token for Mongo monitoring server.
#mms-token = <token>

# Server name for Mongo monitoring server.
#mms-name = <server-name>

# Ping interval for Mongo monitoring server.
#mms-interval = <seconds>

# Replication Options

# in replicated mongo databases, specify here whether this is a slave or master
#slave = true
#source = master.example.com
# Slave only: specify a single database to replicate
#only = master.example.com
# or
#master = true
#source = slave.example.com
# Address of a server to pair with.
#pairwith = <server:port>
# Address of arbiter server.
#arbiter = <server:port>
# Automatically resync if slave data is stale
#autoresync
# Custom size for replication operation log.
#oplogSize = <MB>
# Size limit for in-memory storage of op ids.
#opIdMem = <bytes>

# SSL options
# Enable SSL on normal ports
#sslOnNormalPorts = true
# SSL Key file and password
#sslPEMKeyFile = /etc/ssl/mongodb.pem
#sslPEMKeyPassword = pass

./mongod --config ../conf/mongod.conf 以配置文件方式启动

创建用户信息

db.createUser(
  {
    user: "panlei",
    pwd: "panlei",
    roles: [ { role: "dbAdmin", db: "test" } ]
  }
)
角色介绍

roles:指定用户的角色,可以用一个空数组给新用户设定空角色;在roles字段,可以指定内置角色和用户定义的角色。role里的角色可以选:
Built-In Roles(内置角色):
1. 数据库用户角色:read、readWrite;
2. 数据库管理角色:dbAdmin、dbOwner、userAdmin;
3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
4. 备份恢复角色:backup、restore;
5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
6. 超级用户角色:root
// 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
7. 内部角色:__system
复制代码
具体角色:

Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值