MongoDB基础笔记

2019-04-03  本文已影响0人  neo_ng

outline

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和端口

踩坑记录

  1. pymongo.errors.CursorNotFound: Cursor not found, cursor id: 394738574312
    解决方式
    demos = db['demo'].find({},{"_id": 0},no_cursor_timeout = True):
    解决方案来源

参考资料:

MongoDB分片原理篇
浅谈MongoDB内存

上一篇下一篇

猜你喜欢

热点阅读