zoukankan      html  css  js  c++  java
  • 初识MongoBD

    一、安装

      我使用的系统是Ubuntu16.04,不同版本系统参照官网安装步骤。安装官网4个步骤安装好MongoDB并启动。

    sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6
    //不同版本 选择不同命令执行
    --Ubuntu 12.04 echo "deb http://repo.mongodb.org/apt/ubuntu precise/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list

    --Ubuntu 14.04
    echo "deb http://repo.mongodb.org/apt/ubuntu trusty/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list

    --Ubuntu 16.04
    echo "deb http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list
    sudo apt-get update && apt-get install -y mongodb-org
    sudo service mongod start

    安装MongoDB可视化工具compass(可视化管理工具比较多,可以看这篇文章介绍)。我的可视化工具是安装在Window上,MongoDB安装在Ubuntu上,现在来远程连接。因为都是使用默认配置没有设置连接用户名和密码,所以选择None。

    点击连接,会发现报错提示。需要修改配置文件,打开 /etc/mongod.conf,修改bindIP为:0.0.0.0,并重启服务。当然如果安装的是Window版本的MongoDB和Compass在同一台机器上,可以直接连接不会有报错提示。这里说一个题外话,关于127.0.0.1和0.0.0.0的区别:如上面当配置文件的绑定Ip为127.0.0.1时,那只能本地连接。修改为0.0.0.0则表示一个无效、未知、不可用的目标。在服务器中,0.0.0.0指本机上所有的IPV4地址。

    二、基础概念

      MongoDB中有几个基本概念:文档、集合、数据库,分别对应关系数据库中的数据行、数据表、数据库。MongoDB中也有索引的概念和关系型数据库概念相同。由于MongoDB数据库是介于关系型数据库和非关系行数据库之间,所以不支持表关联。在数据表中自动将_id字段设置为主键。

    三、数据库语句

      首先进入mongodb环境。

    root@VM-0-15-ubuntu:~# mongo

    3.1 创建数据库

    > use User //创建User数据库 Use命令:如果数据库不存在,则创建数据库,否则切换到指定数据库。
    switched to db User

      数据库名区分大小写,最多为64字节。要记住一点,数据库最终会变成文件系统中的文件,而数据库名就是相应的文件名,这是数据库名有如此多限制的原因。

    3.2 创建集合

    > db.createCollection("UserInfo")//创建一个UserInfo的集合 相当于数据表
    { "ok" : 1 }

      db.createCollection(name, options)

    参数说明:

    • name:要创建的集合名称
    • options:可选参数, 指定有关内存大小及索引的选项
    字段 类型 描述
    capped 布尔 (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。
    当该值为 true 时,必须指定 size 参数。
    autoIndexId 布尔 (可选)如为 true,自动在 _id 字段创建索引。默认为 false。
    size 数值 (可选)为固定集合指定一个最大值(以字节计)。如果 capped 为 true,也需要指定该字段。

    max 数值 可选)指定固定集合中包含文档的最大数量。

    3.3 插入数据

    > user={"Name":"Microheart","Age":18}
    { "Name" : "Microheart", "Age" : 18 }
    > db.UserInfo.insert(user) WriteResult({ "nInserted" : 1 })

    与之相同的还有批量插入insertMany()

    > db.UserInfo.insertMany([{"Name":"Name1","Age":22},{"Name":"Name2","Age":23}])
    //返回插入的id {
    "acknowledged" : true, "insertedIds" : [ ObjectId("5b88cecf8320a5dc443845bb"), ObjectId("5b88cecf8320a5dc443845bc") ] }

     在执行批量插入的过程中有一个文档插入失败,那么在这个文档之前的所有文档都会成功插入集合,而这个文档以及之后的所有文档全部插入失败。插入数据时,MongoDB对数据进行最基本的检查:检查文档的基本机构,如果没有"_id”字段,就会自动增加一个。

    3.4 查找数据

    > db.UserInfo.find()
    { "_id" : ObjectId("5b8797397cc91f7ea2f167c8"), "Name" : "Microheart", "Age" : 24 }

    find()后面还可以跟Limit()和Skip()。如:

    db.UserInfo.find().Limit(2).Skip(3) //跳过前3个,查找后面两个。

    3.5 更新数据

    > db.UserInfo.find()
    { "_id" : ObjectId("5b8797397cc91f7ea2f167c8"), "Name" : "Microheart", "Age" : 18 }
    { "_id" : ObjectId("5b8798ac7cc91f7ea2f167c9"), "Name" : "张三", "Age" : 20 }
    > db.UserInfo.update({"Name":"Microheart"},{$set:{"Age":24}})//将Name为Microheart的文档的Age更新为24 WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })//返回匹配的文档的个数为1,修改个数为1

     > db.UserInfo.find()
     { "_id" : ObjectId("5b8797397cc91f7ea2f167c8"), "Name" : "Microheart", "Age" : 24 }//Age的值已经更新
     { "_id" : ObjectId("5b8798ac7cc91f7ea2f167c9"), "Name" : "张三", "Age" : 20 }

    上面对文档部分更新,所以使用了修改器,如果对整个文档进行修改,可以使用文档替换。

    “$set”修改器用来指定一个字段的值。如果这个字段不存在,则创建它。

    “$inc”修改器用来增加已有键(键的类型只能是整数、长整型、双精度浮点型)的值,或者该键不存在那就创建一个。

    > db.UserInfo.find()
    { "_id" : ObjectId("5b8797397cc91f7ea2f167c8"), "Name" : "Microheart", "Age" : 25 }
    { "_id" : ObjectId("5b880944c358f71ebd76fd2b"), "Name" : "Microheart", "Age" : 18 }
    { "_id" : ObjectId("5b88cecf8320a5dc443845bb"), "Name" : "Name1", "Age" : 22 }
    { "_id" : ObjectId("5b88ceee8320a5dc443845be"), "Name" : "Name2" }
    > db.UserInfo.update({"Name":"Name1"},{"$inc":{"Age":1}})//让Age字段增加1 WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
    > db.UserInfo.find({"Name":"Name1"}) { "_id" : ObjectId("5b88cecf8320a5dc443845bb"), "Name" : "Name1", "Age" : 23 }

    3.6 删除

    > db.UserInfo.remove({"Name":"张三"})
    WriteResult({ "nRemoved" : 1 })

    删除数据是永久性的,不能撤销,也不能恢复。

    如果想知道一个函数的其他参数的含义,直接输入函数名(函数名后不要输入小括号),可以看到其js代码。

    3.7 排序

    > db.UserInfo.find().sort({Age:1})//按照Age升序 如果为-1 表示降序
    { "_id" : ObjectId("5b88054098a1f002f4e8beb6"), "Name" : "abc", "Age" : 12 }
    { "_id" : ObjectId("5b8797397cc91f7ea2f167c8"), "Name" : "Microheart", "Age" : 24 }

    四、数据类型

      MongoDB支持的数据类型有:null、布尔型、数值、字符串、日期、正则表达式、数组、内嵌文档、对象id等。

    4.1 日期

      日期被存储为自1970年1月1日0点以来的毫秒数,不存时区。

    4.2 内嵌文档

      举例说明:person中内嵌的address为一个文档

    {
      "person": {
        "name": "Microheart",
        "age": 24,
        "address": {
          "country": "China",
          "province": "ZheJiang",
          "city": "HangZhou"
        }
      }
    }

    4.3 id

      MongoDB中存储的文档必须有一个“_id”键,确保集合里每个文档都能被唯一标识,每个集合中不能有相同的_Id值出现。这个键的值可以是任何类型的,默认为ObjectId对象。

      由于MongoDB设计的初衷就是分布式数据库,所以没有采用想SQL Server和MySql那样能自增的主键,因为这样费时费力,所以保证多个主机生成不同值很重要。ObjectId的12字节按照如下方式生成:

    • 前4个字节表示时间戳
    • 接下来的3个字节是机器标识码
    • 紧接的两个字节由进程id组成(PID)
    • 最后三个字节是随机数。
  • 相关阅读:
    Linux安装软件时90%的人会遇到这个报错,如何解决?
    mongo下查询ObjectId(id)类型的数据
    解决nohup启动logstash生成的文件过大的问题
    ES集群服务器下线节点扩容后上线的流程
    knife4j的使用记录
    mongodb的update函数更新数据,更新文档中的某个具体字段的数据
    Python celery异步框架
    VueX插件使用
    Vue-router插件使用
    Vue 自定义指令
  • 原文地址:https://www.cnblogs.com/MicroHeart/p/9458237.html
Copyright © 2011-2022 走看看