mongo基础

基础

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端口,可通过浏览器访问

本地副本集搭建

  1. 启动三个服务
  • 创建三个目录,本别存放三个节点数据, 启动三个服务分别使用不同的端口和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 &
  1. 创建副本集
  • 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术语/概念解释/说明
databasedatabase数据库
tablecollection数据库表/集合
rowdocument数据记录行/文档
columnfield数据字段/域
indexindex索引
table joins表连接,MongoDB不支持
primary keyprimary 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.mycol1.insert(“name”: “jiang”)
    • show collections

集合update

db.collect.update({‘key’: ‘old_value’}, {$set: {‘key’: ‘new_value’}}, options)

  1. options格式为{option: argv}
  2. options可选
  • query: update的查询条件,类似sql update查询内where后面的。
  • update: update的对象和一些更新的操作符(如 , , ,inc…)等,也可以理解为sql update查询内set后面的
  • upsert: 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
  • multi: 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
  • writeConcern: 可选,抛出异常的级别。
  1. 示例
> 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循环后可以输出全表

  1. 条件查询
  • 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() |
  1. and和or
  • db.col.find({key1: value1, key2: value2}).pretty() # and
  • db.col.find({$or: [{key1: value1}, {key2, value2}, ...]}) # or
  1. 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" }	# 程序先跳过了两条,再取第一条
  1. 排序
  • db.col.find().sort({KEY: 1}) # KEY为1时升序, 为-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" }

备份与恢复

  1. 备份
  • 命令
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,在做备份时可使用此路径 |

  • 命令示例

    1. 全库备份
      mongodump -h 10.0.0.152:27017 -uroot -proot --authenticationDatabase admin -o /home/mongod/backup/full
    2. 备份test库
      mongodump -h 10.0.0.152:27017 -uroot -proot --authenticationDatabase admin -d test -o /home/mongod/backup/
    3. 备份test库下的vast集合
      mongodump -h 10.0.0.152:27017 -uroot -proot --authenticationDatabase admin -d test -c vast -o /home/mongod/backup/
    4. 压缩备份库
      mongodump -h 10.0.0.152:27017 -uroot -proot --authenticationDatabase admin -d test -o /home/mongod/backup/ --gzip
    5. 压缩备份单表
      mongodump -h 10.0.0.152:27017 -uroot -proot --authenticationDatabase admin -d test -c vast -o /home/mongod/backup/ --gzip
  1. 恢复
  • 命令
    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掉,恢复后,备份后添加修改的数据都会被删除,慎用! |

  • 示例

    1. 全库备份中恢复单库(基于之前的全库备份)
      mongorestore -h 10.0.0.152:27017 -uroot -proot --authenticationDatabase admin -d test --drop /home/mongod/backup/full/test/
    2. 恢复test库
      mongorestore -h 10.0.0.152:27017 -uroot -proot --authenticationDatabase admin -d test /home/mongod/backup/test/
    3. 恢复test库下的vast集合
      mongorestore -h 10.0.0.152:27017 -uroot -proot --authenticationDatabase admin -d test -c vast /home/mongod/backup/test/vast.bson
    4. –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

节点

  1. 查看节点信息
    rs.status()
  2. 查看同步状态
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中
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值