• MongoDB入门


    环境交代

    操作系统: CentOS 6.8 64位

    mongodb: 4.06

    安装

    官方下载地址:https://www.mongodb.org/dl/linux/x86_64-rhel62

    阿里云镜像地址:

    mongodb-server: https://mirrors.aliyun.com/mongodb/yum/redhat/6/mongodb-org/4.0/x86_64/RPMS/mongodb-org-server-4.0.6-1.el6.x86_64.rpm

    mongodb-shell: https://mirrors.aliyun.com/mongodb/yum/redhat/6/mongodb-org/4.0/x86_64/RPMS/mongodb-org-shell-4.0.6-1.el6.x86_64.rpm

    如果我们下载的mongodb是社区版的源码包,那么官方已经帮我们编译好,因此不需要我们再次编译,我们只需将下载的文件解压后移动到安装目录即可,比如:移动到/usr/local/mongodb。

    当然我们这里使用的是rpm包安装:

    下载:

     wget https://mirrors.aliyun.com/mongodb/yum/redhat/6/mongodb-org/4.0/x86_64/RPMS/mongodb-org-server-4.0.6-1.el6.x86_64.rpm
     
     wget https://mirrors.aliyun.com/mongodb/yum/redhat/6/mongodb-org/4.0/x86_64/RPMS/mongodb-org-shell-4.0.6-1.el6.x86_64.rpm
    
    

    安装

    rpm -ivh mongodb-org-server-4.0.6-1.el6.x86_64.rpm
    rpm -ivh mongodb-org-shell-4.0.6-1.el6.x86_64.rpm
    

    执行完以上两个步骤,安装完成后,我们的系统中会多出两个命令:mongo(客户端) 和 mongod(服务端),同时生成一个配置文件在/etc/mongod.conf

    启动

    启动服务端

    方式1:

    # 指定配置文件启动
    mongod --config /etc/mongod.conf
    

    方式2:

    如果先使用上一种方式启动,那么使用下面的方法的时候很可能会遇到错误,错误可根据报错内容以及日志内容进行解决。默认日志路径:/var/log/mongodb/mongod.log。以下方式启动,会默认使用/etc/mongod.conf的配置文件。

    # 启动
    service mongod start
    # 重启
    service mongod restart
    # 关闭
    service mongod stop
    
    # 设置开机启动
    chkconfig mongod on
    

    mongodb配置说明请参考:

    https://www.jianshu.com/p/ba63f6c5ad04

    https://www.cnblogs.com/zhoujinyi/p/3130231.html

    启动客户端

    # 启动客户端连接服务端
    mongo
    
    #客户端的更多使用方式查看
    mongo --help
    

    使用

    基本使用

    # 查看数据库
    show dbs
    show databases
    
    查看数据表(其实叫集合更合适)的列表
    show tables
    show collections
    
    # 切换数据库
    use tableName 
    
    # 查看命令帮助
    db.help() 
    
    # 删除tableName表,tableName为表名称
    db.tableName.drop() 
    
    # 删除当前切换到的数据库
    db.dropDatabase() 
    
    # 创建表
    db.createCollection(tableName) 
    

    隐式添加

    如果下级结构添加了,那么上级结构自动也被添加

    比如:我在一个不存在的数据库下创建了一张表,那么这个数据库会被自动创建。

    数据表也支持隐式创建

    插入数据

    db.tableName.insert()
    

    例1:往user表插入一条

    db.user.insert({'name':'shusheng'})
    db.user.insertOne({'name':'shusheng'})
    

    例2:往user表插入多条

    db.user.insert([{'name':'郭昌松','age':20}, {'name':'李志友','girl':['李文斌,李志光']}])
    db.user.insertMany([{'name':'郭昌松','age':20}, {'name':'李志友','girl':['李文斌,李志光']}])
    

    MongoDb支持的数据类型

    数据类型 说明 补充说明
    Object ID 文档id
    String 字符串 必须是utf-8编码
    Boolean 布尔值 只能是 true或者false
    Double 浮点型
    Arrays 数据(列表)
    Object 类似于Python的字典或者js中的json
    Null 只能存Null
    TimeStamp 时间戳
    Date unix格式的时间 YYYY-MM-DD new Date('2019-02-14')

    注:

    每个文档都有的一个属性,其名字为_id,我们可以自己设置,如果未设置,那么mongodb会自动抱我生成,类型为Object ID。自动生成的Object ID是由12位的16进制数组成。前4个为当前时间戳,接下来3个位机器ID,接下来2个为mongodb服务的进程id,最后为自增数据、

    查询数据

    db.tableName.find(where, fileds)
    

    where:查询条件,可选
    fileds获取指定的列, 可选

    操作 格式 范例 关系型数据库中的类似语句
    等于 {<key>:<value>} db.col.find({"by":"书生"}).pretty() where by = '书生'
    小于 {<key>:{$lt:<value>}} db.col.find({"likes":{$lt:50}}).pretty() where likes < 50
    小于或等于 {<key>:{$lte:<value>}} db.col.find({"likes":{$lte:50}}).pretty() where likes <= 50
    大于 {<key>:{$gt:<value>}} db.col.find({"likes":{$gt:50}}).pretty() where likes > 50
    大于或等于 {<key>:{$gte:<value>}} db.col.find({"likes":{$gte:50}}).pretty() where likes >= 50
    不等于 {<key>:{$ne:<value>}} db.col.find({"likes":{$ne:50}}).pretty() where likes != 50

    注:使用pretty()可以让查询到的数据以更好看的形式展现。

    例1:

    db.member.find({name:'baba'})
    

    查询name='baba'的记录

    例2:

    db.member.find({name:'baba',age:30})
    

    查询name='baba'并且age=30的记录

    例3:

    db.member.find({age:{$lt:26}})
    

    查询age小于26的记录

    例4:

    db.member.find({age:{$lt:26, $gt:20}})
    

    查询age大于20小于26的记录

    例5:(投影操作)

    db.user.find({},{name: 1, _id: 0 })
    

    查询所有的数据,只获取name列的值。name的值为1表示获取该列的值,为0表示不获取该列的值。

    附:以格式化后的结构展示查询结果

    db.tableName.find(where).pretty()
    

    删除数据

    db.member.remove(where,justOne)
    

    where:删除的条件表达式
    justOne:当符合条件的文档有多条时,为true只删除一条记录,为false表示全部删除,默认为false

    更新数据

    基本语法

    db.tableName.update(where, data, upsert, multi)
    

    where:条件表达式(更新的条件)
    data:要更新的数据
    upsert:为true时,表示如果根据查询条件表达式找不到记录,则将准备更新的数据插入到表中作为一条新记录,默认为false
    multi:默认为false,表示只更新符合条件的一条记录,如果为true时,表示更新所有的符合条件的记录,该参数必须在含有$操作下才生效

    例子的数据准备:

    db.member.insert({name: 'baba', age: 30, sex: '男', 'money': 999999999})
    

    默认情况下,update会覆盖整个文档(整条记录内容)

    例1:

    db.member.update({name: 'baba'},{'money': 99999999998})
    

    执行完上面的操作,整条记录会变成:{'money': 99999999998}

    只更改部分字段值

    db.tableName.update(条件表达式, {$set: 修改的内容})
    

    $set 可以指定修改某些字段(键)

    例2:

    db.member.update({name: 'baba'}, {$set: {'money': 99999999998}})
    

    执行完上面的操作,整条记录会变成:{name: 'baba', age: 30, sex: '男', 'money': 99999999998}

    例3:第三个参数的使用例子

    db.member.update({name: 'bingbing'}, {name: 'libingbing', age: 40}, true)
    

    如果根据{name: 'bingbing'}找不到符合条件的记录,则将{name: 'libingbing', age: 40}插入到数据表中作为一条新记录。

    例4:第四个参数的使用例子

    正确使用方法:

    db.member.update({name: '小锅'}, {$set: {name: '火锅', age: 3}}, false, true)
    

    错误使用方法:

    db.member.update({name: '小锅'}, {name: '火锅', age: 3}, false, true)
    

    更多查询条件

    逻辑运算符的使用

    AND查询:在Json中直接编写多个条件即可。

    # 查询name为baba 并且 age等于30的
    db.member.find({name: 'baba', age: 30})
    

    OR 查询:值应该是一个数据,使用$or标记

    # 查询name为baba 或者 age等于30的
    db.member.find({$or: [{name: 'baba', age: 30}]})
    
    # 查询 (name为baba 或者 age等于30) 并且性别为1的
    db.member.find({$or: [{name: 'baba', age: 30}], sex: 1})
    
    范围运算符 $in$nin

    判断是否在某个范围

    db.member.find({age: {$in: [20, 22, 24]}})
    
    正则条件 使用定界符 //或者$regex
    db.member.find({name: {$regex: '^ond+'}})
    
    db.member.find({name: /^ond+/})
    
    自定义查询 $where

    可以直接使用js编写条件语句。

    db.member.find({ $where: function(){
            # this 指当前记录, 即每一条记录。查询会扫描整个表中的所有数据
            return this.age > 20;
        } 
    })
    

    读取指定数量的文档

    会用到limit()skip()

    limit(n):获取指定数量的文档

    skip(n):跳过指定数量的文档

    db.member.find({age: 20}).limit(3)
    
    db.member.find({age: 20}).skip(1)
    
    db.member.find({age: 20}).limit(3).skip(1)
    
    db.member.find({age: 20}).skip(1).limit(3)
    
    

    排序 sort()

    db.member.find().sort({age: -1, sex: 1})
    

    统计 count()

    db.member.find().count()
    db.member.find({条件})count()
    db.member.count()
    db.member.count({条件})
    

    去重 distinct()

    # 去重字段要被引号包着
    db.member.distinct("去重字段")
    
    db.member.distinct("去重字段", {条件})
    

    聚合操作 aggregate()

    mongodb的聚合操作是基于管道来处理的。文档可以多个处理过程(stage),各个过程之间由管道相连,每一步处理的结果会是下一步处理的输入值。类似于流水线处理。

    基本语法:

    db.表名称.aggregate({管道: {处理表达式}})
    

    常用管道有:

    管道名称 说明
    $group 分组操作
    $match 过滤
    $project 修改文档结构,如:重命名、增加、删除字段等
    $sort 排序后输出
    $limit 限制条数
    $skip 跳过文档
    $unwind 将数组类型的列进行拆分

    常用处理表达式有:

    表达式名称 说明
    $sum 求和
    $avg 求平均值
    $min 求最小值
    $max 求最大值
    $push 在结果文档中插入值到一个数组中
    $first 获取一个文档数据
    $last 获取最后一个文档数据

    Python操作MongoDB

    pip3 install pymongo
    

    https://blog.csdn.net/adley_app/article/details/80715630

    https://www.cnblogs.com/zhangxinqi/p/9242687.html

    设置用户和密码

    开启认证

    mongod --auth  # 启用认证
    

    创建管理员用户

    use admin
    
    db.createUser({user:"admin",pwd:"password",roles:["root"]})
    
    admin(用户名)password(密码)root(超级账号)
    

    内建角色

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

    认证登录

    db.auth("用户名", "密码")
    

    MongoDB role 类型

    数据库用户角色(Database User Roles)
        read:授予User只读数据的权限
        readWrite:授予User读写数据的权限
    
    数据库管理角色(Database Administration Roles):
        dbAdmin:在当前dB中执行管理操作
        dbOwner:在当前DB中执行任意操作
        userAdmin:在当前DB中管理User
    
    备份和还原角色(Backup and Restoration Roles):
        backup
        restore
    
    跨库角色(All-Database Roles):
        readAnyDatabase:授予在所有数据库上读取数据的权限
        readWriteAnyDatabase:授予在所有数据库上读写数据的权限
        userAdminAnyDatabase:授予在所有数据库上管理User的权限
        dbAdminAnyDatabase:授予管理所有数据库的权限
    
    集群管理角色(Cluster Administration Roles):
        clusterAdmin:授予管理集群的最高权限
        clusterManager:授予管理和监控集群的权限,A user with this role can access the config and local databases, which are used in sharding and replication, respectively.
        clusterMonitor:授予监控集群的权限,对监控工具具有readonly的权限
        hostManager:管理Server
    

    添加数据库用户

    use 数据库名
    
    db.createUser({user: "flowpp", pwd: "flopww", roles: [{ role: "dbOwner", db: "flowpp" }]}) 
    
    # 创建用户flowpp,设置密码flopww,设置角色dbOwner
    

    查看系统用户

    use admin
    
    db.system.users.find()  # 显示当前系统用户
    

    删除用户

    注:删除用户的时候需要切换到用户管理的数据库才可以删除
    use admin
    
    switched to db admin
    
    db.dropUser("flowpp")
    
    false
    
    2.切换flowpp ,删除用户flowpp,删除成功
    
    use flowpp
    
    switched to db flowpp
    
    db.dropUser("flowpp")
    
    true
    
  • 相关阅读:
    PAT 甲级 1002 A+B for Polynomials (25 分)
    数字提取——C语言
    粒子动画——Pygame
    李白打酒——C++
    C语言输出格雷码
    特殊篮子问题——C语言暴力破解
    黑白迷宫问题——深度优先搜索算法
    最近素数问题——C语言
    巧克力分配问题——C语言
    离散数学——逻辑推理系统
  • 原文地址:https://www.cnblogs.com/imxiaoqi/p/10479075.html
Copyright © 2020-2023  润新知