美文网首页
MongoDB学习

MongoDB学习

作者: Sachin猿人 | 来源:发表于2020-05-19 16:46 被阅读0次

    MongoDB学习文档

    作者 sachinly

    MongoDB 简单介绍

    MangoDB 是由C++编写的分布式文件存储的开源数据库系统。在高负载情况下,可以添加更多的节点,从而保证服务器的性能。

    MongoDB主要特点

    • 面向文档存储的数据库,操作起来比较方便和容易
    • 可以在记录中设置任何属性的索引来实现更快的排序
    • 可以通过本地和网络创建数据镜像,具有很强的可扩展性
    • 如果处理能力和存储空间受到限制,可以分布到其他网络节点上
    • 支持丰富的查询表达式。查询指令使用json形式的标记,可以轻易查询到内嵌的对象和数组。
    • 使用update()命令替换已经完成的文档或数据,也可以更新部分字段的数据
    • Map/Reduce是使用Javascript编写,用来对数据的进行批量处理和聚合操作
    • GridFS是MongoDB的内置功能,可以用来存放大量小文件
    • MongoDB 服务端支持自定义JS脚本执行,并可以存储JS脚本以方便调用
    • MongoDB Client 支持多种语言:Java、Ruby、Python、C++、PHP和JS等10多种编程语言
    • MongoDB 安装部署简单

    MongoDB Linux 安装

    1. Ubuntu 在线安装
    • 添加公钥

    wget -qO - https://www.mongodb.org/static/pgp/server-4.2.asc | sudo apt-key add -

    • 添加安装源

    echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.2.list

    • 更新

    sudo apt-get update

    • 安装mongoDB

    sudo apt-get install mongodb-org

    1. 离线安装
    • 下载

    wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-ubuntu1804-4.2.6.tgz

    • 依赖库安装

    sudo apt-get install libcurl4 openssl

    • 解压安装

    tar -zxvf mongodb-linux-x86_64-ubuntu1804-4.2.6.tgz
    sudo cp mongodb-linux-x86_64-ubuntu1804-4.2.6/bin/* /usr/local/bin/

    • 手动创建文件夹

    sudo mkdir -p /var/lib/mong
    sudo mkdir -p /var/log/mongodb
    sudo chown whoami /var/lib/mongo # Or substitute another user
    sudo chown whoami /var/log/mongodb # Or substitute another user

    • 配置文件

    sudo touch /etc/mongos.conf

    在配置文件`/etc/mongos.conf`添加如下内容
    
          # Where and how to store data.
          storage:
            dbPath: /var/lib/mongodb
            journal:
              enabled: true
          #  engine:
          #  mmapv1:
          #  wiredTiger:
    
          # where to write logging data.
          systemLog:
            destination: file
            logAppend: true
            path: /var/log/mongodb/mongod.log
    
          # network interfaces
          net:
            port: 27017
            bindIp: 127.0.0.1
    
          # how the process runs
          processManagement:
            timeZoneInfo: /usr/share/zoneinfo
    
    1. 控制和自启动
    • 启动

    sudo systemctl start mongod

    • 停止

    sudo systemctl stop mongod

    • 状态

    sudo systemctl status mongod

    • 自启动

    sudo systemctl enable mongod

    1. 测试

    mongo

    如下显示

        MongoDB shell version v4.2.6
        connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
        Implicit session: session { "id" : UUID("dfa3b6d1-43e4-4555-a6a7-015415baeaca") }
        MongoDB server version: 4.2.6
        Server has startup warnings:
        2020-05-18T10:01:52.767+0800 I  STORAGE  [initandlisten]
        2020-05-18T10:01:52.767+0800 I  STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
        2020-05-18T10:01:52.767+0800 I  STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
        2020-05-18T10:01:53.922+0800 I  CONTROL  [initandlisten]
        2020-05-18T10:01:53.923+0800 I  CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
        2020-05-18T10:01:53.923+0800 I  CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
        2020-05-18T10:01:53.923+0800 I  CONTROL  [initandlisten]
        ---
        Enable MongoDB's free cloud-based monitoring service, which will then receive and display
        metrics about your deployment (disk utilization, CPU, operation statistics, etc).
    
        The monitoring data will be available on a MongoDB website with a unique URL accessible to you
        and anyone you share the URL with. MongoDB may use this information to make product
        improvements and to suggest MongoDB products and deployment options to you.
        To enable free monitoring, run the following command: db.enableFreeMonitoring()
        To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
        ---
    
        > show dbs
        admin   0.000GB
        config  0.000GB
        local   0.000GB
    
    1. 卸载
    • 停止服务

    sudo service mongod stop

    • 卸载

    sudo apt-get purge mongodb-org*

    • 删除数据和配置文件

    sudo rm -r /var/log/mongodb
    sudo rm -r /var/lib/mongodb
    sudo rm /etc/mongos.conf

    MongoDB 概念解析

    在任何服务或者软件中首先要了解其概念名词术语

    SQL术语 MongoDB术语 解释说明
    database database 数据库/数据库
    table collections 表/集合
    row document 数据记录/文档
    column field 数据字段/域
    index index 索引/索引
    table join —— 表连接/mongoDB不支持
    primary key primary key 主键/mongoDB自动将_id域作为索引
    1. 数据库
      MongoDB 可创建多个独立的数据库,admin local config 是系统默认保留的数据库。数据库名最大支持64个字符,应全部小写。

    2. 集合
      MongoDB中的文档相当于关系型数据库的表。集合存于数据库中,集合没有固定的结构,意味着可以插入不同格式不同类型的数据,通常情况下集合中的数据是有一定的关联性。当文档数据插入数据库时,集合就会被创建。集合名称不能以'system'开头,system是系统集合保留的前缀名。

    3. 文档
      文档是一组键值对,MongoDB的文档不需要设置相同的字段,并且相同的字段不需要相同的类型。这是与关系型数据库最大的区别,也是mongoDB的突出特点。

    4. 数据类型如下表

    类型 描述
    String 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。
    Integer 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。
    Boolean 布尔值。用于存储布尔值(真/假)。
    Double 双精度浮点值。用于存储浮点值。
    Min/Max keys 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。
    Array 用于将数组或列表或多个值存储为一个键。
    Timestamp 时间戳。记录文档修改或添加的具体时间。
    Object 用于内嵌文档。
    Null 用于创建空值。
    Symbol 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。
    Date 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。
    Object ID 对象 ID。用于创建文档的 ID。
    Binary Data 二进制数据。用于存储二进制数据。
    Code 代码类型。用于在文档中存储 JavaScript 代码。
    Regular expression 正则表达式类型。用于存储正则表达式。

    MongoDB远程连接配置

    1. 添加管理员用户

    mongo

          > use admin
          > db.createUser(
            {         
              user: "admin",
              pwd: "Admin@123",
              roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
            }
          )
    

    Mongodb 内置角色介绍

    数据库用户角色  
      - read: 只读数据权限
      - readWrite:读写数据权限
    数据库管理角色  
      - dbAdmin: 在当前db中执行管理操作的权限
      - dbOwner: 在当前db中执行任意操作
      - userADmin: 在当前db中管理user的权限
    备份和还原角色   
      - backup
      - restore
    夸库角色  
      - readAnyDatabase: 在所有数据库上都有读取数据的权限
      - readWriteAnyDatabase: 在所有数据库上都有读写数据的权限
      - userAdminAnyDatabase: 在所有数据库上都有管理user的权限
      - dbAdminAnyDatabase: 管理所有数据库的权限
    集群管理  
      - clusterAdmin: 管理机器的最高权限
      - clusterManager: 管理和监控集群的权限
      - clusterMonitor: 监控集群的权限
      - hostManager: 管理Server
    超级权限  
      - root: 超级用户
    
    1. 数据库添加用户

      mongo

            > use dbname
            > db.createUser(
              {         
                user: "dbuser",
                pwd: "dbuser@123",
                roles: [ { role: "readWrite", db: "dbname" } ]
              }
            )
      
    2. 修改配置文件

    vim /etc/mongod.conf

      ```
          storage:
            dbPath: /var/lib/mongodb
            journal:
              enabled: true
          #  engine:
          #  mmapv1:
          #  wiredTiger:
          systemLog:
            destination: file
            logAppend: true
            path: /var/log/mongodb/mongod.log
          net:
            port: 27017
            bindIp: 127.0.0.1
          processManagement:
            timeZoneInfo: /usr/share/zoneinfo
          security:
            authorization: enabled
          #operationProfiling:
          #replication:
          #sharding:
          ## Enterprise-Only Options:
          #auditLog:
          #snmp:
      ```
      修改`security` 标签下的`authorization` 为`enabled` 即开启认证。然后重启服务
      修改`net` 标签下的`port` 端口和`bindIp`地址,允许远程访问修改为`0.0.0.0` 本地访问`127.0.0.1`
    
    1. 删除用户

    首先修改配置文件,即注释掉 security 下的authorization 然后重启

    mongo

        > use dbname
        > db.dropUser("dbuser")
    

    MongoDB客户端连接

    使用用户名和密码连接到远程的指定数据库上
    mongodb://username:password@host/dbname
    分布式的在其他章节介绍

    python3 连接 MongoDB Server

    pip3 install pymongo

    #!/usr/bin/python3
    
    import pymongo
    
    myclient = pymongo.MongoClient("mongodb://dbuser:dbuser@123@127.0.0.1/dbname")
    mycol = myclient["col_test"]
    
    

    MongoDB 数据库、文档、集合的创建删除

    1. 数据库
    • 创建数据库

    use dbname #如果数据库不存在则创建,如果数据库存在则切换到该数据库。
    show dbs #列出所有数据库,只有数据库有内容数据库才会被真正的创建,如果是空数据库要想被显示,则需要插入数据。
    db.dbcol.insert({"key":"value"}) #自动创建集合dbcol 并插入数据

    • 删除数据库

    use dbname
    db.dropDatabase()

    若数据库中没有集合没有数据,数据库会自动删除

    1. 集合
    • 创建集合

    db.createCollection(colname, options)

    `colname`是集合名称,`options`是选项
    
    • 删除集合

    db.colname.drop()

    show collections 可列出当前数据库下所有的集合colname是集合名称
    options 说明

    字段 类型 描述
    capped Boolean 是否创建固定集合,如果是必须指定固定集合大小size
    autoIndexId Boolean 是否自动在_id 上创建索引,默认是false
    size Integer 固定集合指定的最大值,单位是KB
    max Integer 固定集合的文档的最大数量

    插入文档时,MongoDB先检查size 然后检查max,若达到最大值,新插入的就会覆盖最旧的文档

    1. 文档
      文档的数据结构和JSON基本一样,所有存储在集合的数据都是BSON格式,BSON就是Binary Json
    • 插入文档

    db.COLLECTION_NAME.insert(document)

    db.collection.insertOne()db.collection.insertMany()分别是一次插入一个和多个

    db.colname.insert({
      "title":"mogo",
      "msg":{"aa","bbb"}
      })
    
    • 删除文档

      db.COLLECTION_NAME.remove(DELECTION_CRITERIA)

      DELECTION_CRITERIA为删除条件

    db.colname.remove({"title":"mogo"})
    

    此处的{"title":"mogo"}是查询条件

    • 更新文档

      MongoDB文档更新有update()save()两个方法

      db.COLLECTION_NAME.update(SELECTION_CRITERIA, UPDATED_DATA,{multi:true})

      SELECTION_CRITERIA是查询条件 UPDATED_DATA是更新的数据

      db.colname.update({"title":"mogo"},{$set:{
       "title":"MongoDB title",
       "msg":{"aa":"cccc"}
       }},{multi:false})
      

      若查询结果有多个满足条件,multi:true 决定是否全部更新。

      db.COLLECTION_NAME.save({_id:ObjectId(), NEW_DATA})

      _id内容存在则update,若不存在则插入。

    • 查询文档

      db.collection.find(query, projection)

      query 为查询条件,projection返回数据指定键,默认全部返回

      db.col.find().pretty()

      pretty()格式化输出查询内容,若将find()替换为findOne()则返回一个内容

      AND条件

      db.col.find({key1:value1, key2:value2}).pretty()

      OR条件

      db.col.find({ $or: [ {key1: value1}, {key2:value2}]}).pretty()

      操作运算符

    操作符 格式 范例 RDBMS类似的语句
    等于 {key:value} db.col.find({"ti":"mogo"}).pretty() where ti = 'mogo'
    小于 {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

    ===
    后面还会继续介绍关于查询的内容

    相关文章

      网友评论

          本文标题:MongoDB学习

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