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
            }
        }
    }
}

...

posted @ 2019-10-29 16:09  飞_2016  阅读(210)  评论(0)    收藏  举报