• 01:MongoDB基础


    1.1 MongoDB简介

      1、特点

          1. MongoDB的提供了一个面向文档存储,操作起来比较简单和容易。

          2. 你可以在MongoDB记录中设置任何属性的索引 (如:FirstName="Ning",Address="Beijing")来实现更快的排序。

          3. 你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。

          4. 如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。

          5. Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。

          6. MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。

          7. Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。

          8. Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。

          9. Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。

          10. GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。

          11. MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。

          12. MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。

      2、MongoDB简介

          1. MongoDB是一个文档型的NoSQL数据库,文档型---> BSON文档(json的二进制)
          2. 保存数据:key-value
          3. 一般不支持事务

      3、MongoDB使用场景

        1)更高的写入负载

            默认情况下,MongoDB更侧重高数据写入性能,而非事务安全,MongoDB很适合业务系统中有大量“低价值”数据的场景。

            但是应当避免在高事务安全性的系统中使用MongoDB,除非能从架构设计上保证事务安全。

        2)高可用性

            MongoDB的复副集(Master-Slave)配置非常简洁方便,此外,MongoDB可以快速响应的处理单节点故障,自动、安全的完成故障转移。

            这些特性使得MongoDB能在一个相对不稳定(如云主机)的环境中,保持高可用性。

        3)表结构不明确,且数据在不断变大

      4、MongoDB应用举例

          1. 比如豆瓣影评中有1000部电影,每部电影有1000个影评,每个影评有1000个评论,那么查询笛卡尔积是1000*1000*1000

          2. 而使用MongoDB只需要存储1000条数据即可完成上述数据查询

          

     1.2 MongoDB安装与配置

      1、上传解压安装MongoDB

          mkdir tools # 存放安装包
          mkdir training # 存放安装目录

          tar -zxvf mongodb-linux-x86_64-enterprise-rhel70-3.4.10.tgz -C ~/training/

          vi ~/.bash_profile

    MONGODB_HOME=/root/training/mongodb-linux-x86_64-enterprise-rhel70-3.4.10
    export MONGODB_HOME
    
    PATH=$MONGODB_HOME/bin:$PATH
    export PATH
    .bash_profile

          source ~/.bash_profile                # 生效环境变量, 使在任何位置都可以使用MongoDB命令

          安装MongoDB依赖rpm包

          yum install -y net-snmp*             # 安装net-snmp : 
          yum install -y cyrus*                   # 安装cyrus : 

          启动MongoDB

          mkdir -p /data/db

          mongod --dbpath /data/db          # 指定MongoDB数据库文件存储路径(从3.2版本后,MongoDB的默认的数据引擎:wiredTiger)

          mongod --dbpath /data/db1 --storageEngine=mmapv1         # 早期:内存映射,可以指定参数  --storageEngine=mmapv1

          使用MongoDB Web的控制台:需要在启动MongoDB的时候,指定参数: --httpinterface

          mongod --dbpath /data/db1 --storageEngine=mmapv1 --httpinterface     

      2、测试MongoDB shell

          mongo                     # 进入mongo shell环境

          show dbs                 # 查看所有db

          use mydemo            # 使用我们的数据库(如果没有这个数据库会自动创建)

          db.test1.insert({id:1,"name":"Tom"})                  # 在test1表中插入一条数据(如果没有这个表会自动创建)

     1.3 MongoDB的体系结构

      1、一个MongoDB Server:实例和多个数据库(1:N)

           

      2、逻辑存储结构

           数据库(database)、表(集合Collection)、记录(文档Document)

      3、物理存储结构

        1)--dbpath /data/db 指定数据库文件存储的位置

        2)MongoDB的物理存储的文件
          (*)命名空间文件: 后缀: .ns 大小 16M
          (*)数据文件: 后缀:0,1,2,3****
            大小: 0 ---> 16M
                1 ---> 32M
                2 ---> 64M
          (*)日志文件:存储的位置可能不一样
            (1)直接存储在操作系统
                系统日志文件: 记录的是系统的启动信息、告警信息等等
                journal日志文件:重做日志,即:redo日志,用于恢复
            (2)存储在集合中(Collection)中
                oplog: 复制操作的日志(只在:主从复制的功能)
                慢查询的日志(需要单独配置):一般在生产系统中:大于200毫秒的日志

        注意:从3.2版本后,MongoDB的默认的数据引擎:wiredTiger
        早期:内存映射,可以指定参数 --storageEngine=mmapv1
        新版本:数据文件大小从:64M开始

     1.4 使用mongo shell

      1、启动mongo shell
          mongo                 # 直接输入mongo即可进入mongo shell环境

          mongo -u *** -p *** -host *** -port ***

          参数:

            --username 用户名
            --password 密码
            --host
            --port

      2、可以在mongo Shell使用外部的编辑器:vi

          [root@linux-node2 db]#   export EDITOR=vi                        # 定义环境变量 后需要重新进入mongo shell环境中 
          [root@linux-node2 db]#   mongo     

          MongoDB Enterprise >   function myFunction(){}
          MongoDB Enterprise >   edit myFunction     # 修改myFunction函数

          function myFunction(){print("hello word")}
          MongoDB Enterprise >   myFunction()          # 运行myFunction() 函数
          hello word

      3、使用启动配置文件

          vim ~/.mongorc.js

    
    

    host=db.serverStatus().host;
    cmdCount=1;
    prompt=function(){
    return db+"@"+host+" "+(cmdCount++) +">";
    }

    ''' 此时的mongo shell就会显示 数据库名(test)主机名(linux-node2.example.com)   条数
    test@linux-node2.example.com 1>
    '''

      4、mongo shell的基本操作

          show dbs                       # 查看所有数据库

          use mydemo1                # 使用数据库(如果没有当前数据库会自动创建)

          show tables                    # 查看当前数据库所有表

          show collections             # 查看当前集合

    1.5 MongoDB数据类型

        注:mongo shell数据类型:字符串、整型、布尔值、浮点数、时间 ******

      1、日期类型:date

          使用不同方式来创建一个date
          (*) Date():表示当前时间,插入的是一个字符串类型
          (*) new Date():插入的是isodate类型,表示的是格林威治标准时间
          (*) ISODate(): 类似new Date()

      2、ObjectId:

          当插入数据的时候,自动生成一个字段: _id ---> 相当于主键
          ObjectId是一个12字节的BSON类型的字符串

      3、表示数字的时候,注意的问题
          NumberInt: 表示32位整数
          NumberDecimal:支持34位小数
          Double:如果没有指定数字类型默认是double

      4、测试

    db.test2.insertOne({ "_id" : 1, "val" : NumberDecimal( "9.99" ), "description" : "Decimal" })
    db.test2.insertOne({ "_id" : 2, "val" : 9.99, "description" : "Double" })
    db.test2.insertOne({ "_id" : 3, "val" : 10, "description" : "Double" })
    db.test2.insertOne({ "_id" : 4, "val" : NumberLong(10), "description" : "Long" })
    db.test2.insertOne({ "_id" : 5, "val" : NumberDecimal( "10.0" ), "description" : "Decimal" })
    创建表中测试数据
    
    

    1、查询表中所有数据
    db.test2.find()

    
    

    2、数字不指定数据类型时默认是double类型,所以只能查到一条
    db.test2.find({"val":9.99})
    { "_id" : 2, "val" : 9.99, "description" : "Double" }

    
    

    3、类型为NumberDecimal,值为9.99的数据
    db.test2.find({"val":NumberDecimal("9.99")})
    { "_id" : 1, "val" : NumberDecimal("9.99"), "description" : "Decimal" }

    
    

    4、对于整数10的匹配,将匹配所有的数据类型是10
    db.test2.find({"val":10})
    { "_id" : 3, "val" : 10, "description" : "Double" }
    { "_id" : 4, "val" : NumberLong(10), "description" : "Long" }
    { "_id" : 5, "val" : NumberDecimal("10.0"), "description" : "Decimal" }

    5、db.test2.find({"val":NumberDecimal("10")})
    { "_id" : 3, "val" : 10, "description" : "Double" }
    { "_id" : 4, "val" : NumberLong(10), "description" : "Long" }
    { "_id" : 5, "val" : NumberDecimal("10.0"), "description" : "Decimal" }

    111111111111111111111

  • 相关阅读:
    Cocos2d-x之物理世界(创建悬浮的物体)
    Cocos2d-x之物理世界(创建静态的物体)
    Cocos2d-x之物理世界(创建运动的物体)
    cocos2d-x之Node移除HelloWorld节点
    IFNULL NULLIF ISNULL
    表格导出
    random模块
    Echarts
    "==" 与 "is"的区别
    angular
  • 原文地址:https://www.cnblogs.com/xiaonq/p/10356568.html
Copyright © 2020-2023  润新知