outline
- MongoDB常用命令
- MongoDB的CRUD
- 索引
- MongoDB的安装
- 踩坑记录
MongoDB常用命令
mongo 远程主机ip或DNS:MongoDB端口号/数据库名 -u user -p password
mongo启动命令:
mongod --bind_ip 0.0.0.0 --port 8014 --storageEngine=wiredTiger --dbpath=/opt/project/mongo/data/ --fork --logpath=/data/MongoDB/logs/mongod.log --logappend --wiredTigerCacheSizeGB 1
数据库备份与恢复
mongodump -h dbhost -d dbname -o dbdirectory
参数说明:
-h: MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017
-d: 需要备份的数据库实例,例如:test
-o: 备份的数据存放位置,例如:/home/mongodump/,当然该目录需要提前建立,这个目录里面存放该数据库实例的备份数据。
mongorestore -h dbhost -d dbname --dir dbdirectory
参数或名:
-h: MongoDB所在服务器地址
-d: 需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2
--dir: 备份数据所在位置,例如:/home/mongodump/itcast/
--drop: 恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用!
文件的导入导出
mongoexport -d dbname -c collectionname -o file --type json/csv -f field
参数说明:
-d :数据库名
-c :collection名
-o :输出的文件名
--type : 输出的格式,默认为json
-f :输出的字段,如果-type为csv,则需要加上-f "字段名"
/usr/bin/mongoexport -d pyspider_resultdb -c eastmoney_report_hangyeyanbao_001 -o /data/mongoexport/eastmoney_report_hangyeyanbao_001.dat
mongoimport -d dbname -c collectionname --file filename --headerline --type json/csv -f field
参数说明:
-d :数据库名
-c :collection名
--type :导入的格式默认json
-f :导入的字段名
--headerline :如果导入的格式是csv,则可以使用第一行的标题作为导入的字段
--file :要导入的文件
eg:
mongoimport --port 8014 -d pyspider_resultdb -c eastmoney_report_quanshangchenhui_001 --file eastmoney_report_quanshangchenhui_001.dat
MongoDB 查看数据库和空间大小
db.stat()
监控
通过mongo命令行来监控MongoDB的内存使用情况,如下所示:
mongo> db.serverStatus().mem:
{
"resident" : 22346,
"virtual" : 1938524,
"mapped" : 962283
}
通过mongostat命令来监控MongoDB的内存使用情况,如下所示:
shell> mongostat
mapped vsize res faults
940g 1893g 21.9g 0
940g 1893g 21.9g 0
940g 1893g 21.9g 0
940g 1893g 21.9g 0
940g 1893g 21.9g 0
其中内存相关字段的含义是:
mapped:映射到内存的数据大小
visze:占用的虚拟内存大小
res:实际使用的内存大小
MongoDB的CRUD
更新
mongo文档更新操作
db.test.update({'id':2},{'$inc':{'id':2}}) # 增加值
db.getCollection("all_report").updateMany({"status":"1"},{"$unset":{"status":""}}) # 批量更新
删除
db.getCollection("subscribe").remove({"user_id":"49"}) # 删除文档
db.User.update({},{$unset:{'address':''}},false, true)
db.getCollection("all_news").updateMany({"status":"1"},{"$unset":{"status":""}}) #
db.getCollection("all_news").updateMany({"status":"1"},{"$set":{"test_status":"1"}})
增加
- 增加文档
db.collection.insert()
查询
db.getCollection('BasicInfo').find({knowledge:{$exists:false}}) #查询某个字段不存在得文档
db.collection.find({ "field" : { $gt: value } } ); // greater than : field > value
复杂查询
模糊匹配
{"name": {$regex:/kg/i}}
组合查询:
or and 嵌套
{ $and: [{"name": {$regex:/kg/i}}, {"name": {$regex:/kd/i}}]}
{ $or: [{"name": {$regex:/kg/i}}, {"name": {$regex:/kd/i}}]}
{ $and: [{ $or: [{"name": {$regex:/kg/i}}, {"name": {$regex:/kd/i}}]}]}
{ $or: [{ $and: [{"name": {$regex:/kg/i}}, {"name": {$regex:/kd/i}}]}]}
索引
创建索引
设置使用多个字段创建索引(关系型数据库中称作复合索引)
db.col.createIndex({"title":1,"description":-1})
db.getCollection("all_news").createIndex({"clean_html":1})
update 和 upsert一定要加索引!!!
需对mongo的字段建立索引,否则会出现如下错误
pymongo.errors.OperationFailure: Executor error during find command: OperationFailed: Sort operation used more than the maximum 33554432 bytes of RAM. Add an index, or specify a smaller limit.
查看集合中的索引
db.COLLECTION_NAME.getIndexes()
MongoDB基本概念
MongoDB的特点
灵活模式--json
高可用性--副本集
可扩展性--分片
副本集(replica)
副本集由若干台服务器组成,分为三种角色:主服务器、副服务器、仲裁服务器
分片(sharding) Sharded cluster
将大的数据分片存储在不同节点上,外部读写只操作相应的一个或一小部分节点,一次减少每个分片节点村春的数据量和处理的请求数 。
分片架构
Mongos作为Sharded cluster的访问入口,所有的请求都由mongos来路由、分发、合并,这些动作对客户端driver透明,用户连接mongos就像连接mongod一样使用。
Config Server 存储元数据
shard 存储用户数据
分片策略
范围分片
哈希分片
MongoDB的安装
MongoDB会占用所有能用的内存,所以最好不要把别的服务和MongoDB放一起
docker单机搭建mongo:
docker run -p 27017:27017 -v $PWD/db:/data/db -d mongo:3.2
docker run -p 27017:27017 -v /opt/project/mongo/data:/data/db -d mongo:3.2
直接如果本地不存在image,则从官网DockerHub拉去镜像
-p 27017:27017 :将容器的27017 端口映射到主机的27017 端口
-v $PWD/db:/data/db :将主机中当前目录下的db挂载到容器的/data/db,作为mongo数据存储目录
docker集群搭建
docker中运行mongo副本集
// 通过 –replSet 设定副本集名称
sudo docker run --name rs_server1 -p 21117:27017 -d pc/mongos:master --noprealloc --smallfiles --replSet rs1
sudo docker run --name rs_server2 -p 22117:27017 -d pc/mongos:master --noprealloc --smallfiles --replSet rs1
sudo docker run --name rs_server3 -p 23117:27017 -d pc/mongos:master --noprealloc --smallfiles --replSet rs1
sudo docker run --name rs_server1 -p 21117:27017 -d mongo:3.2 --noprealloc --smallfiles --replSet rs1
sudo docker run --name rs_server2 -p 22117:27017 -d mongo:3.2 --noprealloc --smallfiles --replSet rs1
sudo docker run --name rs_server3 -p 23117:27017 -d mongo:3.2 --noprealloc --smallfiles --replSet rs1
myconf = {"_id":"rs1","members":[{"_id":0,"host":"172.17.0.1:27017"},{"_id":1,"host":"172.17.0.2:27017"},{"_id":2,"host":"172.17.0.3:27017"}]}
myconf = {"_id":"rs1","members":[{"_id":0,"host":"192.168.11.131:21117"},{"_id":1,"host":"192.168.11.131:22117"},{"_id":2,"host":"192.168.11.131:23117"}]}
mongo集群初始化同步复制集权:
rs.initiate(myconf)
重新配置:
rs.reconfig(myconf)
一步一步教你搭建基于docker的MongoDB复制集群环境
MongoDB副本集:
Replica Sets复制集
Replica Sets的结构类似一个集群
mongo与es同步
mongo-connector实现MongoDB与elasticsearch实时同步深入详解
MongoDB--mongo-connector-->ElasticSearch;
MongoDB和es数据同步的方式
mongo-connector -m 192.168.11.131:21117 -t 192.168.11.131:9200 -d elastic2_doc_manager
pip install mongo-connector
pip install elastic2-doc-manager
pip install elasticsearch==5.4.0
note:当使用mongo-connector时,mongo复制集的配置中host需使用宿主机的ip和端口
踩坑记录
- pymongo.errors.CursorNotFound: Cursor not found, cursor id: 394738574312
解决方式
demos = db['demo'].find({},{"_id": 0},no_cursor_timeout = True):
解决方案来源
参考资料:
MongoDB分片原理篇
浅谈MongoDB内存