第三讲-MongoDB基础知识

本文详细对比了MongoDB与关系型数据库的区别,并介绍了MongoDB的核心概念如文档、集合、数据库,以及基本操作如数据库、集合的创建与管理、数据的插入、查询、更新和删除。同时,阐述了MongoDB的基本数据类型及其特点,如null、布尔、数字、字符串、对象ID等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. MongoDB和关系性数据库的对比

  • 关系型数据库的表的每行数据record必须保证拥有每个filed(换句话说就是每行数据的所有字段必须完全相同)
  • mongoDB的每一个document的key可以不一样(每个文档保存的字段可以不一样)
  • 关系型数据库查询使用SQL语句,mongoDB自带简洁但是功能强大的javaScript Shell
  • MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限

  

2. 核心概念

2.1 文档

    1) 定义: 文档是MongoDB的核心概念,多个键以及关联的值有序地放置在一起便是文档。

    2) 注意

     例如:下面两个文档

     ①  {"greeting" : "hello,world","foo"  :  3}   ②    {"foo"  :  3 ,"greeting" : "hello,world"}

  • 文档中的键值对是有序的,上面的文档和下面的文档是完全不同的,文档里面是有序的
  • 文档的键是字符串,而值可以是字符串也可以是整数等类型
  • 文档的键是字符串,除了少数例外情况,键可以使用任意UTF-8的字符串
    • 键不能含有\0(空字符串)。这个字符用来表示键的结尾
    • .和$有特别的意义,只有在特定环境下才能使用,通常来说就是被保留了,使用不当的话,驱动程序会提示
    • 以下划线"_"开头的键是保留的,虽然这个并不是严格要求的
  • MongoDB不但区分类型,也去分大小写{ "foo" : 3} {"foo" : "3"}是不同的,因为类型不同,{"foo" : 3}  {"Foo" : 3}也是不同的的,因为键的大小写不同
  • 文档中的键不能有重复

2.2 集合

    1) 定义: 集合就是一组文档,要是说文档是类似于关系数据库的行,那么集合就如同表

    2) 注意

     集合是无模式的,任何两个文档都可以存放在集合中,那么为什么还要有多个集合呢?

  • 把不同的文档混在一起,对查询比较麻烦
  • 在一个集合里面做特定查询,速度也没有分开多个集合快
  • 把同种类型的文档放在一个集合里面,这样数据会更加集中,也更好管理
  • 当创建索引的时候,文档会有附加的结构(尤其是有唯一索引的时候)。索引是按照集合来定义的,把同种类型的文档放入同一个集合里面,可以使索引更加有效

     3) 命名

  • 集合名不能是空字符串""
  • 集合名不能含有"\0"字符(空字符),这个字符表示集合名的结尾
  • 集合名不能以 "system." 开头,这是为系统集合保留的前缀,例如 "system.users" 是保存数据库的用户信息
  • 不能含有保留保留字符$。

2.3 数据库

     MongoDB中多个文档组成集合,同样多个集合可以组成数据库。一个MongoDB实例可以承载多个数据库,他们之间可以视为完全独立的,每个数据库都有自己独立的权限控制,即使是在磁盘上,不同的数据库也放置在不同的文件中,应该将一个应用的所有数据都存储在同一个数据库中。

     命名注意事项:

  • 不能是空字符串
  • 不得含有''(空格)、. 、$ 、/ 和 \0(空字符)
  • 应该全部小写
  • 最多64字节

特殊数据库:

     1)admin    

        从权限角度来看,这是 'root' 数据库,要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的表现

     2)local

这个数据永远不会被复制,可以用来存储限于单台服务器的任意集合

     3) config

        当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息

      数据库的名字放到集合名前面,得到就是集合的完全限定名,称为命名空间。例如,如果你在cms数据库中使用blog.posts集合,那么这个集合的命名空间就是cms.blog.posts.命名空间长度应该不得超过121字节。

3.基本操作

3.1 数据库操作

     1)创建数据库

       use mydb(如果不插入数据,则不保存数据库)

     2)查看所有数据库

        show dbs

        > show dbs;

         local  0.078GB      

         不显示mydb或者显示mydb(empty),是因为mydb里面没有任何数据,是空的    

     3)查看当前连接的数据库

               db

      4)销毁数据库

         首先使用use mydb,然后调用 db.dropDatabase()销毁数据库

3.2 集合操作

     1)创建集合

        在一个数据库中mydb创建一个集合(users)

         use mydb

         db.createCollection("users")

     2)查看创建的集合

          show Collections

     3)删除集合

          db.users.drop()

3.3 向集合中插入数据

     1) 使用 insert()

         use mydb

         db.users.insert() 如果users集合没有创建,则自动创建

      2)使用save()

          插入数据时,如果users集合没有创建,则自动创建

      3) 读取

          db.users.find()和db.users.findOne()

          find会返回集合里面所有的文档,若只想看一个文档,可以用findOne

      4) 更新

          db.users.update(filter,new)

          update有两个条件,第一个是更新文档的限定文件,第二个是新的文档。

      5) 删除

          remove用来从数据库永久性地删除文档,在不使用参数进行调用的情况下,它会删除一个集合内的所有文档,也可以接受一个文档以指定限定条件

          db.users.remove()或者db.users.remove(filter,new)

3.3 使用在线帮助文档

       db.help(),db.foo.help()

4.基本数据类型

4.1 基本类型

      MongoDB的文档类似于JSON,但是JSON的表现力有限,因为只有null,布尔,数字,字符串,数组,对象几种类型。所以MongoDB在保留JSON基本的键值对特性的基础上,添加了其他一些数据类型。

以下是包含的数据类型:

      1)null

          null用于表示空值或者不存在的字段

      2)布尔

          布尔类型有两个值‘true’和‘false’

      3)32位整数

          shell中这个类型不可用。前面提到,JavaScript仅支持64位浮点32位整数会被自动转换

      4)64位整数

          shell也不支持这个类型。shell会使用一个特殊的内嵌文档来显示64位整数

      5)64位浮点数

shell中的数字都是这种类型

{"x" : 3.14} {"x" : 3}都是这种浮点数

      6)字符串

          UTF-8 字符串都可表示为字符串类型的数据

          {"x" : "foobar"}

       7)对象id

          对象id是文档12字节的唯一ID

          {"x":objectId()}

       8)日期

          日期类型存储的是从标准纪元开始的毫秒数,不存储时区

          {"x" : new Date()}

       9)正则表达式

           文档中可以包含正则表达式,采用JavaScript的正则表达式语法

          {"x" : /foobar/i}

       10)代码

            文档中可以包含JavaScript代码

             {"x"  : function(){/* ... */}}

        11)二进制数据

            二进制数据可以由任意字节的串组成,不过shell中无法使用

        12)最大值

            BSON包括一个特殊类型,表示可能的最大值。shell中没有这个类型

        13)最小值

            BSON包括一个特殊类型,表示可能的最小值,shell中没有这个类型

        14)未定义

            文档中也可以使用未定义类型(JavaScrript中null和undefined)

        15)数组

            值的集合或者列表可以表示成数组

             {"X" : ["a","b","c"]}

        16)内嵌文档

             文档可以包含别的文档,可以作为值嵌入到父文档中

   _id和ObjectId

     MongonDB中存储的文档必须有一个"_id"键,这个键可以是任何类型,如果没有会默认生成一个ObjectId类型的对象作为"_id"键,每个集合的"_id"必须是唯一的。

     ObjectId是"_id"的默认类型,不同的机器能用全局唯一的同种方法方便的生成他,这是MongoDB采用ObjectId而不是其他比较常规的(比如自动增加的主键)的主要原因,因为在多个服务器上同步自动增加主键值即费时还费力。MongoDB从一开始就设计用来作为分布式数据库,处理多个节点是一个核心要求。

     ObjectId使用12自己的存储空间,每个字节两位16位制数字,共24个数字。

     自习观察ObjectId,发现快速连续创建多个ObjectId,每次只有最后几位发生变化,如果停顿几秒,或者重新连接,会发现中间几位也会发生变化。生成Id是在客户端进行的。

     Object生成方式:

    

  • 前四个字节是从标准纪元开始的时间戳,单位是秒,由于时间戳在前,这意味着ObjectId大致会按照插入的顺序排列,但是不能保证唯一,这个四个字节也隐含了文档的创建时间,因为使用的是当前时间,很多用户担心要对服务器进行时间同步,其实没有这个必要,因为时间戳的实际值并不重要,只要不停地增加就可以了
  • 接下来的3字节是所在主机的唯一标识符,通常是机器主机名的散列值,这样就能保证不同主机生成不同的ObjectId,不产生冲突。
  • 为了确保同一主机上多个并发进程产生的ObjectId是唯一的,接下来两个字节表示进程标识符
  • 为了确保同一时间同一主机同一个进程产生的ObjectId是不同的,最后三个字节是一个自动增加的计数器,同一秒钟每个进程最多拥有256*256*256个不同的ObjectId

  mongoDB的API

  http://api.mongodb.org/js/2.1.2/index.html

 

转载于:https://www.cnblogs.com/lseverfor/articles/4845417.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值