基础
MongoDB
下载安装
curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6.tgz
tar -zxf mongodb-linux-x86_64-3.0.6.tgz
mv mongodb-linux-x86_64-3.0.6/ /usr/local/mongodb
echo "export PATH=/usr/local/mongodb/bin:$PATH" >> ~/.bashrc
创建数据目录
MongoDB的数据默认存储在/data/db目录下,此目录在安装时不会自己创建,需要手动创建
mkdir -p /data/db
启动服务
mongod & # 服务启动时会占用当前shell, 使用&打入后台,默认监听27017端口
ss -na|grep 27017 # 查看端口是否开启
mongod --dbpath=/data/db --rest & # 此命令启动服务时会开启一个比MongoDB端口大1000的web端口,可通过浏览器访问
本地副本集搭建
- 启动三个服务
- 创建三个目录,本别存放三个节点数据, 启动三个服务分别使用不同的端口和data目录, --replSet指定副本集名称(这块是rs0), 记住这个副本集名称
mkdir -p /data/db{1..3}
mongod --host localhost --port 10000 --dbpath=/data/db0 --replSet rs0 &
mongod --host localhost --port 11000 --dbpath=/data/db1 --replSet rs0 &
mongod --host localhost --port 12000 --dbpath=/data/db2 --replSet rs0 &
- 创建副本集
- config里面主id为开启服务时指定的副本集名称rs0, 成员(members)id按顺序
mongo --host localhost --port 10000
config = {_id:"rs0", members:[
{_id:0,host:"localhost:27017"},
{_id:1,host:"localhost:27018"},
{_id:2,host:"localhost:27019"}
]}
rs.initiate(config)
交互式操作
[root@Py ~]# mongo
MongoDB shell version: 3.0.6
connecting to: test
> 3 + 3
6
> db.runoob.insert({x: 10}) # 将数字10插入到runoob集合的x字段中
WriteResult({ "nInserted" : 1 })
> db.runoob.find()
{ "_id" : ObjectId("5b0f5f057e833d0e88dcc8c7"), "x" : 10 }
>
MongoDB与传统SQL联系
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
交互式常用操作
show dbs # 查看database
db # 查看当前使用的database
use dbname # 切换至dbname数据库,若数据库不存在则会创建,新建的数据库使用show不会显示,只有插入数据之后才会显示出来
db.dbname.insert({key:value}) # 数据库中写入数据
db.dropDatabase() # 删除当前数据库
show collections = show tables # 查看当前数据库中的集合, 两条命令都可以查询当前db所有的集合
db.sitename.drop() # 删除sitename集合
db.colname.drop() # 删除集合
创建集合
db.createCollection(name, options) # options格式 {option1: argv, option2: argv, …}, options可选:
字段 | 类型 | 描述 |
---|---|---|
capped | 布尔 | (可选)如果为true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。当该值为true时,必须指定size参数。 |
autoIndexId | 布尔 | (可选)如为true,自动在_id字段创建索引。默认为false。 |
size | 数值 | (可选)为固定集合指定一个最大值(以字节计)。如果capped为true,也需要指定该字段。 |
max | 数值 | (可选)指定固定集合中包含文档的最大数量。 |
- 创建固定集合mycol,整个集合空间大小6142800KB, 文档最大个数为10000个:
- db.createCollection(“mycol”, {capped: true, size: 6142800, max: 1000})
- db.createCollection(“mycol”, {capped: true, size: 6142800, max: 1000})
- 当直接插入数据时,系统会自己创建集合
- db.mycol1.insert(“name”: “jiang”)
- show collections
- db.mycol1.insert(“name”: “jiang”)
集合update
db.collect.update({‘key’: ‘old_value’}, {$set: {‘key’: ‘new_value’}}, options)
- options格式为{option: argv}
- options可选
- query: update的查询条件,类似sql update查询内where后面的。
- update: update的对象和一些更新的操作符(如
,
,
,inc…)等,也可以理解为sql update查询内set后面的
- upsert: 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
- multi: 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
- writeConcern: 可选,抛出异常的级别。
- 示例
> use test
> db.test_collection.insert( [
{"name":"abc","age":"25","status":"zxc"},
{"name":"dec","age":"19","status":"qwe"},
{"name":"asd","age":"30","status":"nmn"},
] )
更新单个文档
> db.test_collection.updateOne({"name":"abc"},{$set:{"age":"28"}})
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
> db.test_collection.find()
{ "_id" : ObjectId("59c8ba673b92ae498a5716af"), "name" : "abc", "age" : "28", "status" : "zxc" }
{ "_id" : ObjectId("59c8ba673b92ae498a5716b0"), "name" : "dec", "age" : "19", "status" : "qwe" }
{ "_id" : ObjectId("59c8ba673b92ae498a5716b1"), "name" : "asd", "age" : "30", "status" : "nmn" }
>
更新多个文档
> db.test_collection.updateMany({"age":{$gt:"10"}},{$set:{"status":"xyz"}}) # age大于10的数据全部更新
{ "acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 }
> db.test_collection.find()
{ "_id" : ObjectId("59c8ba673b92ae498a5716af"), "name" : "abc", "age" : "28", "status" : "xyz" }
{ "_id" : ObjectId("59c8ba673b92ae498a5716b0"), "name" : "dec", "age" : "19", "status" : "xyz" }
{ "_id" : ObjectId("59c8ba673b92ae498a5716b1"), "name" : "asd", "age" : "30", "status" : "xyz" }
查询语句
查询每次只能出部分数据,不会全表输出,使用skip查看下面的部分数据; 使用Python连接之后for循环后可以输出全表
- 条件查询
- db.col.find(条件).pretty()
- pretty()可以使输出更易读
| 格式 | 范例 | RDBMS中的类似语句 |
| — | — | — |
|{<key>:<value>}
|db.col.find({"name":"MongoDB"}).pretty()
| where name = ‘MongoDB’ |
|{<key>:{$lt:<value>}}
|db.col.find({"age":{$lt:50}}).pretty()
| where age < 50 |
| 或等于 |{<key>:{$lte:<value>}}
|db.col.find({"age":{$lte:50}}).pretty()
|
|{<key>:{$gt:<value>}}
|db.col.find({"age":{$gt:50}}).pretty()
| where age > 50 |
| 或等于 |{<key>:{$gte:<value>}}
|db.col.find({"age":{$gte:50}}).pretty()
|
| 于 |{<key>:{$ne:<value>}}
|db.col.find({"age":{$ne:50}}).pretty()
|
- and和or
db.col.find({key1: value1, key2: value2}).pretty() # and
db.col.find({$or: [{key1: value1}, {key2, value2}, ...]}) # or
- limit与skip
db.col.find().limit(1) # 返回第一条
db.col.find().limit(1).skip(1) # 返回第二条, 程序先会跳过一条, 然后在做limit
示例:
> db.mycol.insert( [
... {"name":"abc","age":"25","status":"zxc"},
... {"name":"dec","age":"19","status":"qwe"},
... {"name":"asd","age":"30","status":"nmn"},
... ] )
BulkWriteResult({
"writeErrors" : [ ],
"writeConcernErrors" : [ ],
"nInserted" : 3,
"nUpserted" : 0,
"nMatched" : 0,
"nModified" : 0,
"nRemoved" : 0,
"upserted" : [ ]
})
> db.mycol.find()
{ "_id" : ObjectId("5b10e0e4a833229d8e40562b"), "name" : "chao" }
{ "_id" : ObjectId("5b10eb14a833229d8e40562c"), "name" : "abc", "age" : "25", "status" : "zxc" }
{ "_id" : ObjectId("5b10eb14a833229d8e40562d"), "name" : "dec", "age" : "19", "status" : "qwe" }
{ "_id" : ObjectId("5b10eb14a833229d8e40562e"), "name" : "asd", "age" : "30", "status" : "nmn" }
> db.mycol.find().limit(1)
{ "_id" : ObjectId("5b10e0e4a833229d8e40562b"), "name" : "chao" }
> db.mycol.find().limit(1).skip(2)
{ "_id" : ObjectId("5b10eb14a833229d8e40562d"), "name" : "dec", "age" : "19", "status" : "qwe" } # 程序先跳过了两条,再取第一条
- 排序
db.col.find().sort({KEY: 1}) # KEY为1时升序, 为-1时降序
- 模糊匹配
db.col.find({key: /正则/}).pretty() # 以前后/为开始和结尾, 中间写正则(只支持部分正则)
示例:
> db.mycol.insert([{"name":"abc","age":"25","status":"zxc
... {"name":"dec","age":"19","status":"qwe"},
... {"name":"asd","age":"30","status":"nmn"}
... ])
> db.mycol.find({'name': /[a-z]/})
{ "_id" : ObjectId("5b10ed55a833229d8e405632"), "name" : "abc", "age" : "25", "status" : "zxc" }
{ "_id" : ObjectId("5b10ed55a833229d8e405633"), "name" : "dec", "age" : "19", "status" : "qwe" }
{ "_id" : ObjectId("5b10ed55a833229d8e405634"), "name" : "asd", "age" : "30", "status" : "nmn" }
> db.mycol.find({'name': /d/})
{ "_id" : ObjectId("5b10ed55a833229d8e405633"), "name" : "dec", "age" : "19", "status" : "qwe" }
{ "_id" : ObjectId("5b10ed55a833229d8e405634"), "name" : "asd", "age" : "30", "status" : "nmn" }
备份与恢复
- 备份
- 命令
mongodump -h localhost -d dbname -o backup_dir_path
-
更多参数
| 参数 | 参数说明 |
| — | — |
| -h | 指明数据库宿主机的IP,后面可加端口号,host:port |
| -u | 指明数据库的用户名 |
| -p | 指明数据库的密码 |
| -d | 指明数据库的名字 |
| -c | 指明collection的名字 |
| -o | 指明到要导出的文件名 |
| -q | 指明导出数据的过滤条件 |
| --authenticationDatabase | 验证数据的名称 |
| --gzip | 备份时压缩 |
| --oplog | use oplog for taking a point-in-time snapshot,在导出的同时生成一个oplog.bson文件 |
| --dbpath | 指定数据在本地的存储目录,比如本文档启动服务时使用的是默认目录/data/db,在做备份时可使用此路径 | -
命令示例
- 全库备份
mongodump -h 10.0.0.152:27017 -uroot -proot --authenticationDatabase admin -o /home/mongod/backup/full
- 备份test库
mongodump -h 10.0.0.152:27017 -uroot -proot --authenticationDatabase admin -d test -o /home/mongod/backup/
- 备份test库下的vast集合
mongodump -h 10.0.0.152:27017 -uroot -proot --authenticationDatabase admin -d test -c vast -o /home/mongod/backup/
- 压缩备份库
mongodump -h 10.0.0.152:27017 -uroot -proot --authenticationDatabase admin -d test -o /home/mongod/backup/ --gzip
- 压缩备份单表
mongodump -h 10.0.0.152:27017 -uroot -proot --authenticationDatabase admin -d test -c vast -o /home/mongod/backup/ --gzip
- 全库备份
- 恢复
- 命令
mongorestore -h <hostname><:port> -d dbname <path>
--host <:port>, -h <:port> MongoDB所在服务器地址,默认为: localhost:27017
--db, -d 需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2
--drop 恢复的时候,先删除当前数据,然后恢复备份的数据.就是说,恢复后,当时备份之后添加修改的数据都会被删除,慎用!
不能同时指定<path>和--dir选项,--dir也可以设置备份目录。
- `--dir 指定备份的目录`<br />
-
参数
| 参数 | 参数说明 |
| — | — |
| -h | 指明数据库宿主机的IP |
| -u | 指明数据库的用户名 |
| -p | 指明数据库的密码 |
| -d | 指明数据库的名字 |
| -c | 指明collection的名字 |
| --authenticationDatabase | 验证数据的名称 |
| --oplog | use oplog for taking a point-in-time ,在导出的同时生成一个oplog.bson文件 |
| --drop | 恢复的时候把之前的集合drop掉,恢复后,备份后添加修改的数据都会被删除,慎用! | -
示例
- 全库备份中恢复单库(基于之前的全库备份)
mongorestore -h 10.0.0.152:27017 -uroot -proot --authenticationDatabase admin -d test --drop /home/mongod/backup/full/test/
- 恢复test库
mongorestore -h 10.0.0.152:27017 -uroot -proot --authenticationDatabase admin -d test /home/mongod/backup/test/
- 恢复test库下的vast集合
mongorestore -h 10.0.0.152:27017 -uroot -proot --authenticationDatabase admin -d test -c vast /home/mongod/backup/test/vast.bson
- –drop参数实践恢复
- 全库备份中恢复单库(基于之前的全库备份)
# 恢复单库
mongorestore -h 10.0.0.152:27017 -uroot -proot --authenticationDatabase admin -d test --drop /home/mongod/backup/test/
# 恢复单表
mongorestore -h 10.0.0.152:27017 -uroot -proot --authenticationDatabase admin -d test -c vast --drop /home/mongod/backup/test/vast.bson
节点
- 查看节点信息
rs.status() - 查看同步状态
use admin
db.printSlaveReplicationInfo() # 查看同步信息
db.printReplicationInfo() # 查看oplog元数据信息
Python操作
from pymongo import MongoClient
conn = MongoClient(host='10.101.12.181', port=3004, username='jgc', password='Jiang8233')
conn.db_name.col_name.find()
conn.db_name.col_name.insert()
conn.local.command('collstats', 'oplog.rs', scale=1048576) # 查看oplog信息
conn.admin.command('replSetGetStatus') # 查看复制集信息
conn.admin.command('replSetGetConfig') # 获取复制集config信息
查询或者插入操作和交互式一样,都可使用skip或其他,格式均为: 连接串.库名.表明.操作
注: 在Python里面查询使用条件时比如$eq需要加上引号, 例:
db.col_name.find({'name': {$eq: 'jgc'}}) # 在mongo交互式中
conn.db_name.col_name.find({'name': {'$eq': 'jgc'}}) # 在Python中