zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    6-Python爬虫-分布式爬虫/Redis
    ES 查询时 排序报错(fielddata is disabled on text fileds by default ... )解决方法
    Intellij Idea webstorm 激活
    Intellij Idea 配置jdk
    java 获取(格式化)日期格式
    js 跳转 XSS漏洞 预防
    CSS去掉背景颜色
    js对象无法当成参数传递 解决方法
    Elasticsearch java api
    java多条件查询SQL语句拼接的小技巧
  • 原文地址:https://www.cnblogs.com/imxiaoqi/p/10479075.html
Copyright © 2011-2022 走看看