zoukankan      html  css  js  c++  java
  • MongoDB常用操作

    安装

    yum安装

    官方教程
    编辑/etc/yum.repos.d/mongodb-org-4.2.repo
    写入:

    [mongodb-org-4.2]
    name=MongoDB Repository
    baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86_64/
    gpgcheck=1
    enabled=1
    gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc
    

    然后yum install -y mongodb-org即可

    安装成功后会被安装为service

    1. 通过systemctl enable mongod设置开机自启动
    2. 通过systemctl start mongod启动mongo服务
    3. 通过systemctl stop mongod关闭mongo服务
    4. 通过systemctl disable mongod关闭开机自启动

    yum卸载

    查看安装了哪些程序
    yum list installed | grep mongo
    根据以上结果进行卸载
    yum remove -y mongodb-org-mongos.x86_64 mongodb-org-server.x86_64 mongodb-org-shell.x86_64 mongodb-org-tools.x86_64

    二进制安装

    官方下载地址
    win所有版本
    rhel70所有版本,适用Centos7

    # 下载
    wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.2.12.tgz
    
    # 解压
    tar zxvf mongodb-linux-x86_64-rhel70-3.2.12.tgz
    
    # 移动到你想的位置
    mv  mongodb-linux-x86_64-rhel70-3.2.12 /home/data/
    cd /home/data/mongodb-linux-x86_64-rhel70-3.2.12
    
    # 创建一个配置文件,示例:
    cat mongo.conf
    systemLog:
      destination: file
      logAppend: true
      path: /home/data/mongodb-linux-x86_64-rhel70-3.2.12/27017/mongod_27017.log
    
    storage:
      dbPath: /home/data/mongodb-linux-x86_64-rhel70-3.2.12/27017
      journal:
        enabled: true
      engine: wiredTiger
      wiredTiger:
        engineConfig:
          journalCompressor: snappy
          cacheSizeGB: 2
        collectionConfig:
          blockCompressor: snappy
        indexConfig:
          prefixCompression: true
    processManagement:
      fork: true
      pidFilePath: /home/data/mongodb-linux-x86_64-rhel70-3.2.12/27017/mongod_27017.pid
    net:
      port: 27017
      bindIp: 192.168.0.100,127.0.0.1
    
    # 配置文件中的路径不存在的话需要手动创建
    mkdir 27017
    
    # 启动
    ./bin/mongod -f mongo.conf
    
    # PS. 我这边启动顺利,可能是环境比较完整,没有出现缺失lib的现象
    

    集群搭建

    我还不会

    备份

    使用root账号操作其他库

    --authenticationDatabase admin

    备份整个database

    mongodump -h 127.0.0.1:27017 -d dbName -o . -u user -p password
    不加-p的话,以交互式方式输入密码(当密码因含有特殊字符,无法直接写在shell中时,如带小括号的密码,可以采用这种方式)
    mongodump -h 127.0.0.1:27017 -d dbName -o . -u user

    备份具体Collection

    mongodump -h 127.0.0.1:27017 -d dbName -c collectionName -o . -u user -p password
    不加-p同上

    恢复

    mongorestore -h 127.0.0.1:27017 -d dbName --drop dumpFolder -u user -p password
    当用户名和密码不是当前库的用户名密码时(比如admin里面的root账号),需要加上authenticationDatabase,否则会auth fail
    mongorestore -h 127.0.0.1:27017 -d dbName --drop dumpFolder -u user -p password --authenticationDatabase admin

    角色

    1. Read:允许用户读取指定数据库
    2. readWrite:允许用户读写指定数据库
    3. dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
    4. userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
    5. clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
    6. readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
    7. readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
    8. userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
    9. dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
    10. root:只在admin数据库中可用。超级账号,超级权限
    11. __system:内部角色

    用户

    创建用户

    注意,roles中的db只说明有哪些db的权限而已,但是在账号密码登录的时候,还是需要在创建用户时的db下

    db.createUser(
      {
        user: "user",
        pwd: "password",
        roles: [ { role: "readWrite", db: "dbName" } ]
      }
    )
    

    查看用户

    db.system.users.find().pretty()
    db.system.users.find({"user":"username"}).pretty()
    

    修改用户

    删除用户

    常用操作

    批量修改

    第一个参数是过滤条件,第二个参数是动作
    db.collName.updateMany({}, {"$set":{"key":"value"}})

    查询集合大小

    db.collName.find().size()

    数据库监控

    mongostat --host 192.168.106.147:27017 -uroot -p'auto_test@123' --authenticationDatabase admin

    通过profile监控性能

    开启/设置

    ps. 如果在admin中开启监控,所有的库都会被监控;如果在特定库开启监控,只会记录当前库的信息。

    # 查看级别
    # 值为0|1|2,分别代表意思:0代表关闭,1代表记录慢命令,2代表全部
    auto_test:PRIMARY> db.getProfilingLevel()
    0
    
    # 查看状态:级别和时间
    auto_test:PRIMARY> db.getProfilingStatus()
    { "was" : 0, "slowms" : 500 }
    
    # 修改当前数据库的分析级别
    auto_test:PRIMARY> db.setProfilingLevel(2)
    { "was" : 0, "slowms" : 500, "ok" : 1 }
    
    # 设置级别和时间(有时候一次执行不行,需要两次)
    auto_test:PRIMARY> db.setProfilingLevel(2, 100)
    { "was" : 2, "slowms" : 100, "ok" : 1 }
    
    # 这个表貌似没索引,放心删
    db.system.profile.drop()
    

    常用命令

    # 返回最近的10条记录
    db.system.profile.find().limit(10).sort({ts: -1}).pretty()
    
    #返回所有的操作,除command类型的
    db.system.profile.find({op: {$ne: 'command'}}).pretty()
    
    #返回特定集合
    db.system.profile.find({ns: 'mydb.test'}).pretty()
    
    # 查询执行时间大于500ms的记录
    db.system.profile.find({millis: {$gt: 500}}).pretty()
    
    #从一个特定的时间范围内返回信息
    db.system.profile.find(
                           {
                            ts: {
                                  $gt: new ISODate("2012-12-09T03:00:00Z") ,
                                  $lt: new ISODate("2012-12-09T03:40:00Z")
                                }
                           }
                          ).pretty()
    
    #特定时间,限制用户,按照消耗时间排序
    db.system.profile.find(
                           {
                             ts: {
                                   $gt: new ISODate("2011-07-12T03:00:00Z") ,
                                   $lt: new ISODate("2011-07-12T03:40:00Z")
                                 }
                           },
                           {user: 0}
                          ).sort({millis: -1})
    

    性能问题

    geoNear两种方式性能差异 todo

    {
        "aggregate":"__collection__",
        "pipeline":[
            {
                "$geoNear":{
                    "maxDistance":0.005487495800105893,
                    "minDistance":0.004703567828662194,
                    "distanceMultiplier":6378.137,
                    "num":{
                        "$numberLong":"500"
                    },
                    "near":[
                        113.251335,
                        23.168062
                    ],
                    "spherical":true,
                    "distanceField":"distance"
                }
            },
            {
                "$match":{
                    "role":2000
                }
            },
            {
                "$limit":{
                    "$numberLong":"500"
                }
            }
        ]
    }
    
    {
        "$geoNear":{
            "near":{
                "type":"Point",
                "coordinates":[
                    113.838711,
                    22.695883
                ]
            },
            "distanceField":"dis",
            "spherical":true,
            "minDistance":0,
            "maxDistance":5000,
            "num":500,
            "query":{
                "address_id":{
                    "$in":[
                        45,
                        95,
                        33
                    ]
                },
                "age":{
                    "$gte":18
                }
            }
        }
    }
    

    ...

  • 相关阅读:
    Java内存模型
    如何使用原生的Ribbon
    家穷应该读大学吗?| 寒门学子的奋斗史(一)
    试用期没过,因在公司上了1024网站。。。
    两个"�"="锟斤拷"?
    Java字符类Character字符串类String和StringBuffer
    Python抽象基类的定义与使用
    Java数字类Number和Math
    ESP8266 NodeMCU手把手入门(实操篇)——读取传感器的值
    不下软件,照样可以完美正确格式化树莓派SD卡!(恢复U盘/SD卡到满容量)
  • 原文地址:https://www.cnblogs.com/CSunShine/p/11759371.html
Copyright © 2011-2022 走看看