美文网首页
MongoDB基础笔记

MongoDB基础笔记

作者: neo_ng | 来源:发表于2019-04-03 20:44 被阅读0次

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

    踩坑记录

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

    参考资料:

    MongoDB分片原理篇
    浅谈MongoDB内存

    相关文章

      网友评论

          本文标题:MongoDB基础笔记

          本文链接:https://www.haomeiwen.com/subject/ujstiqtx.html