mongoDB

作者: 运维开发_西瓜甜 | 来源:发表于2019-01-23 22:52 被阅读81次
    image.png 千锋云计算

    Shell 环境基本操作

    下载

    一、下载MongoDB

    打开官网下载地址:

    https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/

    分别对应4个平台,windows、Linux、OSX和Solaris

    安装

    官方仓库软件包介绍
    包名字 描述
    mongodb-org 一个元数据包,将自动安装下面列出的四个组件软件包
    mongodb-org-server 包含mongod守护进程和相关的配置以及init脚本
    mongodb-org-mongos 包含mongos守护进程
    mongodb-org-shell 包含mongo shell 命令行解释器
    mongodb-org-tools 其他工具

    mongodb-org-server软件包提供了一个mongod以/etc/mongod.conf 配置文件为参照的初始化脚本。
    默认的配置文件中默认 bind_ip 设置为127.0.0.1 这是个默认监听地址。

    安装社区版
    1. 配置包管理系统(yum)。
      创建一个/etc/yum.repos.d/mongodb-org-3.6.repo文件,以便您可以直接使用安装MongoDB yum。
    [root@izuf6fuxiq5o2qj8wsqvr3z ~]# cat /etc/yum.repos.d/mongodb-org-3.6.repo
    [mongodb-org-3.6]
    name=MongoDB Repository
    baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.6/x86_64/
    gpgcheck=1
    enabled=1
    gpgkey=https://www.mongodb.org/static/pgp/server-3.6.asc
    

    假如你想安装 3.4 版本,那么创建 3.4 的仓库文件

    # cat /etc/yum.repos.d/mongodb-org-3.4.repo
    [mongodb-org-3.4]
    name=MongoDB 3.4 Repository
    baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
    gpgcheck=0
    enabled=1
    
    1. 安装MongoDB软件包。

    要安装最新的稳定版本的MongoDB,执行以下命令:

    sudo yum install -y mongodb-org
    

    要安装特定版本的MongoDB,请分别指定每个组件包并将版本号附加到包名称,如下例所示:

    sudo yum install -y mongodb-org-3.6.3 mongodb-org-server-3.6.3 mongodb-org-shell-3.6.3 mongodb-org-mongos-3.6.3 mongodb-org-tools-3.6.3
    

    您可以指定任何可用的MongoDB版本。但是yum ,当更新的版本可用时,将升级软件包。
    为防止意外升级,将以下exclude指令添加到您的/etc/yum.conf文件中:

    exclude = mongodb-org,mongodb-org-server,mongodb-org-shell,mongodb-org-mongos,mongodb-org-tools
    
    启动服务
    # systemctl start mongod
    # systemctl enable mongod
    # ss -ntal
    State      Recv-Q Send-Q Local Address:Port               Peer Address:Port
    LISTEN     0      128          *:22                       *:*
    LISTEN     0      1      127.0.0.1:32000                    *:*
    LISTEN     0      128    127.0.0.1:27017                    *:*
    
    停止服务
    # systemctl stop mongod
    
    一些配置建议

    大多数类Unix操作系统会限制会话可能使用的系统资源。这些限制可能会对MongoDB的运营产生负面影响。有关更多信息,请参阅UNIX ulimit设置。

    MongoDB实例默认存储其数据文件/var/lib/mongo 及其日志文件/var/log/mongodb,并使用mongod 用户帐户运行。您可以在中指定备用日志和数据文件目录/etc/mongod.conf。
    请参阅 systemLog.path
    storage.dbPath获取更多信息。

    如果更改运行MongoDB进程的用户,则 必须修改/var/lib/mongo和 /var/log/mongodb目录的访问控制权限,以使该用户可以访问这些目录

    MangoHub for Mac

    https://github.com/bububa/MongoHub-Mac

    本地连接

    [shark@localhost ~]$ mongo
    MongoDB shell version v3.4.10
    connecting to: mongodb://127.0.0.1:27017
    ............略.............
    

    创建/删除库, 创建/删除集合、数据

    use dbname

    db.createCollection('xiguatian_col')

    # 查看当前的的数据库
    > show dbs;
    admin  0.000GB
    local  0.000GB
    
    # 新建/切换 库
    > use qfedu
    switched to db qfedu
    > show dbs;
    admin  0.000GB
    local  0.000GB
    
    # 查看当前处于哪个库
    > db;
    qfedu
    > use local
    switched to db local
    > db
    local
    
    # 新建的库,初始没有数据,是查看不到的。
    # MongoDB中的集合(和数据库)的一个重要注意事项是它们是懒惰地创建的。
    > show dbs;
    admin  0.000GB
    local  0.000GB
    > use qfedu
    switched to db qfedu
    
    # 在一个数据库中,创建一个集合(table 表)
    #@1 通过 Mongo 语法创建一个集合
    > use skedu
    switched to db skedu
    > db
    skedu
    > db.createCollection("users")
    { "ok" : 1 }
    >
    
    #@2 通过向一个集合中直接插入一条数据来创建这个集合
    > use qfedu
    switched to db qfedu
    > db
    qfedu
    > db.users.insert({id:001,name: "yangge",age:18,gender: "男"})  # users 就是集合名称
    WriteResult({ "nInserted" : 1 })
    >
    
    # 查看当前库里的集合(表)
    > show tables;
    users
    >
    或者
    >show collections;
    users
    
    # 库里有数据,数据包括 集合,就会看到这个新建立的库了
    > show dbs;
    admin      0.000GB
    local      0.000GB
    qfedu      0.000GB
    skedu      0.000GB
    >
    
    # 删除数据库,需要先进到库里
    > use skedu
    switched to db skedu
    > db
    skedu
    > show dbs;
    admin      0.000GB
    local      0.000GB
    qdedu      0.000GB
    qfedu      0.000GB
    skedu      0.000GB          # 注意这个 skedu 是我们当前的库,需要删除
    testtable  0.000GB
    > db.dropDatabase()         # 执行删除库的命令,就会把当前库删除
    { "dropped" : "skedu", "ok" : 1 }
    > db
    skedu
    > show dbs;                 # 可以看到数据库 skedu 已经被删除了
    admin      0.000GB
    local      0.000GB
    qdedu      0.000GB
    qfedu      0.000GB
    testtable  0.000GB
    
    # 删除集合
    ## 我们先再次创建 skedu 这个库。
    > use skedu;
    switched to db skedu
    
    ## 之后在这个库中创建一个名为: ansible_result 的集合,并向这个集合中插入一条数据
    > db.ansible_result.insert({hosts: "172.16.153.130",result:{msg:"success"}})
    WriteResult({ "nInserted" : 1 })
    
    ## 现在可以把这个集合删除了
    > show tables;               # 删除的集合必须在这个库中存在
    ansible_result
    > db.ansible_result.drop()   # 删除集合的命令
    true
    > show collections;
    >
    

    查询

    db.collections.findOne()
    db.collections.find()

    1. 进入到某个库中,查询库中集合 ansible_result 下的所有数据,并进行格式化输出。
    > db.ansible_result.find().pretty()
    {
        "_id" : ObjectId("5aa475c3f0b766a230830470"),
        "hosts" : "172.16.153.130",
        "success" : {
            "msg" : {
                "start" : "2018-0203 18:09:02",
                "end" : "2018-02-03 18:09:03",
                "cmd" : "ls /tmp",
                "stdout" : "file.txt"
            }
        }
    }
    ................ 略 ................
    
    1. 查集合中的第一条数据
    > db.ansible_result.findOne()
    {
        "_id" : ObjectId("5aa475c3f0b766a230830470"),
        "hosts" : "172.16.153.130",
        "success" : {
            "msg" : {
                "start" : "2018-0203 18:09:02",
                "end" : "2018-02-03 18:09:03",
                "cmd" : "ls /tmp",
                "stdout" : "file.txt"
            }
        }
    }
    >
    
    1. 查询指定添加的数据
    > db.ansible_result.findOne({"hosts": "172.16.153.131"})   # hosts 可以不加引号
    {
        "_id" : ObjectId("5aa47659f0b766a230830471"),
        "hosts" : "172.16.153.131",
        "success" : {
            "msg" : {
                "start" : "2018-0203 18:10:02",
                "end" : "2018-02-03 18:10:03",
                "cmd" : "ls /tmp",
                "stdout" : "file.txt"
            }
        }
    }
    

    更新数据

    db.collections.update()

    # 当前库.这个集合.update({条件的key: "条件的value"}, {$set: {需要更新的数据, 字典类型}} )
    > > db.ansbile_result.update({hosts: "172.16.153.130"}, {$set:{hosts: "172.16.153.110"}})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    
    

    验证更新, 这里使用了 find 来查找数据,并且没有对结果进行格式化输出

    > db.ansbile_result.find({hosts: "172.16.153.130"}).pretty()
    > db.ansbile_result.find({hosts: "172.16.153.110"}).pretty()
    {
        "_id" : ObjectId("5aa475c3f0b766a230830470"),
        "hosts" : "172.16.153.110",
        "success" : {
            "msg" : {
                "start" : "2018-0203 18:09:02",
                "end" : "2018-02-03 18:09:03",
                "cmd" : "ls /tmp",
                "stdout" : "file.txt"
            }
        }
    }
    >
    

    深度更新和查找

    ==深度更新和查找的添加必须用引号引起来==

    > db.ansbile_result.update({hosts: "172.16.153.110"}, {$set:{"success.msg.start": "子文档更新的开始日期"}})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    > db.ansbile_result.findOne({"success.msg.start": "子文档更新的开始日期"})
    {
        "_id" : ObjectId("5aa475c3f0b766a230830470"),
        "hosts" : "172.16.153.110",
        "success" : {
            "msg" : {
                "start" : "子文档更新的开始日期",
                "end" : "2018-02-03 18:09:03",
                "cmd" : "ls /tmp",
                "stdout" : "file.txt"
            }
        }
    }
    >
    
    

    条件查询

    表示符 含义
    $gt 大于
    $lt 小于
    $eq 等于
    $gte 大于等于
    $lte 小于等于

    大于、小于、等于

    > db.ansbile_result.find({hosts:{$gt: "172.16.153.110"}})
    { "_id" : ObjectId("5aa47659f0b766a230830471"), "hosts" : "172.16.153.131", "success" : { "msg" : { "start" : "2018-0203 18:10:02", "end" : "2018-02-03 18:10:03", "cmd" : "ls /tmp", "stdout" : "file.txt" } } }
    { "_id" : ObjectId("5aa47680f0b766a230830472"), "hosts" : "172.16.153.132", "success" : { "msg" : { "start" : "子文档更新的开始日期", "end" : "2018-02-03 18:12:03", "cmd" : "ls /tmp", "stdout" : "file.txt" } }, "msg" : { "start" : "被修改的日期" } }
    > db.ansbile_result.find({hosts:{$lt: "172.16.153.111"}})
    { "_id" : ObjectId("5aa475c3f0b766a230830470"), "hosts" : "172.16.153.110", "success" : { "msg" : { "start" : "子文档更新的开始日期", "end" : "2018-02-03 18:09:03", "cmd" : "ls /tmp", "stdout" : "file.txt" } } }
    > db.ansbile_result.find({hosts:{$eq: "172.16.153.110"}})
    { "_id" : ObjectId("5aa475c3f0b766a230830470"), "hosts" : "172.16.153.110", "success" : { "msg" : { "start" : "子文档更新的开始日期", "end" : "2018-02-03 18:09:03", "cmd" : "ls /tmp", "stdout" : "file.txt" } } }
    

    大于等于和小于等于

    > db.ansbile_result.find({hosts:{$gte: "172.16.153.110"}})
    { "_id" : ObjectId("5aa475c3f0b766a230830470"), "hosts" : "172.16.153.110", "success" : { "msg" : { "start" : "子文档更新的开始日期", "end" : "2018-02-03 18:09:03", "cmd" : "ls /tmp", "stdout" : "file.txt" } } }
    { "_id" : ObjectId("5aa47659f0b766a230830471"), "hosts" : "172.16.153.131", "success" : { "msg" : { "start" : "2018-0203 18:10:02", "end" : "2018-02-03 18:10:03", "cmd" : "ls /tmp", "stdout" : "file.txt" } } }
    { "_id" : ObjectId("5aa47680f0b766a230830472"), "hosts" : "172.16.153.132", "success" : { "msg" : { "start" : "子文档更新的开始日期", "end" : "2018-02-03 18:12:03", "cmd" : "ls /tmp", "stdout" : "file.txt" } }, "msg" : { "start" : "被修改的日期" } }
    
    > db.ansbile_result.find({hosts:{$lte: "172.16.153.110"}})
    { "_id" : ObjectId("5aa475c3f0b766a230830470"), "hosts" : "172.16.153.110", "success" : { "msg" : { "start" : "子文档更新的开始日期", "end" : "2018-02-03 18:09:03", "cmd" : "ls /tmp", "stdout" : "file.txt" } } }
    >
    

    删除数据

    db.collections.remove({条件})

    > db
    skedu
    > show collections;
    ansbile_result
    
    > db.ansbile_result.find()
    { "_id" : ObjectId("5aa475c3f0b766a230830470"), "hosts" : "172.16.153.110", "success" : { "msg" : { "start" : "子文档更新的开始日期", "end" : "2018-02-03 18:09:03", "cmd" : "ls /tmp", "stdout" : "file.txt" } } }
    { "_id" : ObjectId("5aa47659f0b766a230830471"), "hosts" : "172.16.153.131", "success" : { "msg" : { "start" : "2018-0203 18:10:02", "end" : "2018-02-03 18:10:03", "cmd" : "ls /tmp", "stdout" : "file.txt" } } }
    { "_id" : ObjectId("5aa47680f0b766a230830472"), "hosts" : "172.16.153.132", "success" : { "msg" : { "start" : "子文档更新的开始日期", "end" : "2018-02-03 18:12:03", "cmd" : "ls /tmp", "stdout" : "file.txt" } }, "msg" : { "start" : "被修改的日期" } }
    
    > db.ansbile_result.remove(
    ... {
    ... "_id": ObjectId("5aa47680f0b766a230830472")         # 删除的条件
    ... }
    ... )
    WriteResult({ "nRemoved" : 1 })
    
    > db.ansbile_result.find()                              # 验证结果
    { "_id" : ObjectId("5aa475c3f0b766a230830470"), "hosts" : "172.16.153.110", "success" : { "msg" : { "start" : "子文档更新的开始日期", "end" : "2018-02-03 18:09:03", "cmd" : "ls /tmp", "stdout" : "file.txt" } } }
    { "_id" : ObjectId("5aa47659f0b766a230830471"), "hosts" : "172.16.153.131", "success" : { "msg" : { "start" : "2018-0203 18:10:02", "end" : "2018-02-03 18:10:03", "cmd" : "ls /tmp", "stdout" : "file.txt" } } }
    >
    

    删除的条件一样支持深度查找

    > db.ansbile_result.remove(
    ... {'success.msg.start': "子文档更新的开始日期"})
    WriteResult({ "nRemoved" : 1 })
    > db.ansbile_result.find()
    { "_id" : ObjectId("5aa47659f0b766a230830471"), "hosts" : "172.16.153.131", "success" : { "msg" : { "start" : "2018-0203 18:10:02", "end" : "2018-02-03 18:10:03", "cmd" : "ls /tmp", "stdout" : "file.txt" } } }
    >
    

    删除 集合 中的所有数据:
    版本: MongoDB server version: 3.4.10

    > db.users2.remove({})             # 删除的命令, 目前的版本 大括号是必须的
    WriteResult({ "nRemoved" : 4 })    # 返回的信息,删除了 4 条数据
    

    用户认证管理

    一. 修改配置文件

    将以下内容加入到 mongo.conf

    security:
       # 启用或禁用基于角色的访问控制(RBAC)来控制每个用户对数据库资源和操作的访问
       # disabled | enabled
        authorization: enabled
    

    Mongo 安装好后,默认是 disabled 的,要想启用认证,必须先创建一个用户管理员账号。这个账号专门用于创建用户,包括给这些用户赋予不同的绝色,并且可以针对不同的数据库赋予不同的角色。

    下面的命令用于创建 admin 数据库,并在 admin 数据库中创建 用户管理员账号 UserAdmin, admin 数据库专门用于验证用户身份的。

    use admin
    db.createUser(
      {
        user: "myUserAdmin",
        pwd: "abc123",
        roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
      }
    )
    

    之后可以退出 Mongo 并,重启服务

    systemctl restart mongod.service
    

    使用用户认证机制连接 Mongo 可以用两种方式:

    1. 在连接 Mongo 时,传入用户的认证信息和已有认证权限的数据库
    2. 先连接 Mongo, 之后切换到已有认证权限的数据库,使用 db.auth("user_name", "password") 进行认证。

    第一种:

    mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"
    

    第二种:

    mongo --port 27017
    use admin
    db.auth("myUserAdmin", "abc123" )
    

    测试

    [shark@SharkAir ~]# ssh root@172.16.153.134
    Last login: Sat May  5 07:18:09 2018 from 172.16.153.1
    [root@localhost ~]# mongo --port 27017
    MongoDB shell version v3.4.10
    connecting to: mongodb://127.0.0.1:27017/
    MongoDB server version: 3.4.10
    > use admin
    switched to db admin
    > db.auth("root", "123456")
    1
    > use users_db
    switched to db users_db
    > users_li = [
    ...      {"name": "user1", "age": "18"},
    ...      {"name": "user2", "age": "18"},
    ...      {"name": "user3", "age": "19"},
    ... ]
    [
        {
            "name" : "user1",
            "age" : "18"
        },
        {
            "name" : "user2",
            "age" : "18"
        },
        {
            "name" : "user3",
            "age" : "19"
        }
    ]
    > users_li.forEach(function(doc){
    ...     db.users_col.insertOne(doc)
    ...     }
    ... )
    > i = 1
    1
    > db.users_col.insertOne({"_id": i,
    ...                       "name": "xiaoming",
    ...                       "age": "21"}
    ...                     )
    { "acknowledged" : true, "insertedId" : 1 }
    > db.users_col.count()
    4
    > db.users_col.find({age: {$gte:"19"}})
    { "_id" : ObjectId("5aeced834d90515b97b8b1cb"), "name" : "user3", "age" : "19" }
    { "_id" : 1, "name" : "xiaoming", "age" : "21" }
    >
    
    users_li = [
         {"name": "user1", "age": "18"},
         {"name": "user2", "age": "18"},
         {"name": "user3", "age": "19"},
    ]  
    

    三.以授权的方式启动Mongo,给使用的数据库添加用户

    use test
    db.createUser(
      {
        user: "myTester",
        pwd: "xyz123",
        roles: [ { role: "readWrite", db: "test" },
                 { role: "read", db: "reporting" } ]
      }
    )
    

    1.切换数据库

    use test
    

    2.创建用户

    db.createUser({user: "root", pwd: "123456", roles: [{ role: "dbOwner", db: "test" }]})
    
    1. 使用认证的用户连接远程数据库
    mongo -u qf_dbadmin -p 123456 172.16.153.134:27017/qfedu
    

    用户: qf_dbadmin
    密码: 123456
    服务器地址: 172.16.153.134
    端口: 27017
    数据库名: qfedu

    导出数据

    Mongodb中的mongoexport工具可以把一个collection导出成JSON格式或CSV格式的文件。可以通过参数指定导出的数据项,也可以根据指定的条件导出数据。

    mongoexport --help
    

    参数说明:

    -h:指明数据库宿主机的IP
    -u:指明数据库的用户名
    -p:指明数据库的密码
    -d:指明数据库的名字
    -c:指明collection的名字
    -f:指明要导出那些列
    -o:指明到要导出的文件名
    -q:指明导出数据的过滤条件

    示例:

    导出 数据库 qfedu 下的 集合 users 里的数据,导出到当前目录下的 qf_users.dat 文件.
    导出的格式默认是 JSON。

    命令:

    mongoexport -d qfedu -c users -o qf_users.dat
    

    指定导出格式为 csv,并且指定导出哪些字段

    mongoexport -d qfedu -c users --csv -f id,name,age,gender -o qf_users_csv.dat
    

    参考资料: http://www.mongodb.org.cn/manual/198.html

    导入数据

    Mongodb中的mongoimport工具可以把一个特定格式文件中的内容导入到指定的collection中。该工具可以导入JSON格式数据,也可以导入CSV格式数据.

    查看帮助文档:

    mongoimport --help
    

    参数说明:

    -h:指明数据库宿主机的IP
    -u:指明数据库的用户名
    -p:指明数据库的密码
    -d:指明数据库的名字
    -c:指明collection的名字
    -f:指明要导入那些列

    示例:

    [root@localhost ftp]# mongoimport -h 172.16.153.134:27017 -u qf_dbadmin -p 123456 -d qfedu -c users3 qf_users.dat
    2018-05-04T20:16:55.174+0800    connected to: 172.16.153.134:27017
    2018-05-04T20:16:55.176+0800    imported 2 documents
    

    指定导入 csv 格式的文件的数据到指定的库和集合中:

    mongoimport -d qfedu -c users --type csv --headerline --file  qf_users_csv.dat
    

    退出

    > exit
    bye
    

    相关文章

      网友评论

          本文标题:mongoDB

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