mongodb 基础知识(一)

95 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情

前言

之前一篇中介绍了mongodb的容器安装以及spring boot整合mongodb的简单数据操作。由于是直接上手的操作。对于mongodb还有很多的基础知识没有掌握,于是决定结合官方的文档来学习一波知识。

与MySql对比

提到数据库,可能大家第一时间想到的就是MySQL了,那么mongodb和它有什么异同呢?

数据库MySQLMongoDB
databasedatabase
tablecollection
记录rowdocument

可以发现两者之间的对应还是挺直观的。比较明显的不同在于,在mysql中我们的一条记录是一个由字段类型和字段值组成的一行记录,而在mongodb中则是一个json。json的话是一个键值对的结构,但是它内部可以嵌套对象和数组,这个是它的一大特点,也是我觉得和mysql这边最大的一个不同之处。 首先我们进入mongodb的shell交互环境。查询下现在所有的数据库。

> show dbs

admin 0.000GB

config 0.000GB

local 0.000GB

test 0.000GB

可以看到我们之前已经有些数据库了我们使用创建数据库的命令来创建数据库,例如

use market

重新执行查询所有数据库的命令可以发现我们新创建的数据库还没有显示出来。原因是mongodb会在你首次往这个database中添加数据的时候创建这个database。所以我们尝试添加一些数据。

> db.product.insertOne({name:'玩具汽车',price:50.2})
{
        "acknowledged" : true,
        "insertedId" : ObjectId("62519ac1bd42defeee43f2af")
}

现在我们向product这个集合中添加了一条数据。 重新使用show dbs命令可以看到market数据库已经产生了。注意这里我们虽然没有创建collection 但是mongodb会在执行insertOne这个命令时会创建当时不存在的database和collection。 我们来查看下目前数据库中所存在的collection

> show collections

product

我们也可以再创建一个collection这次可以使用直接创建集合而不创建文档的方式。

> db.createCollection('customer')

{ "ok" : 1 }

> show collections

customer

product
db.createCollection(name, options)

这个创建集合的命令有两个参数,第一个name参数时必填参数,指的是集合的名称,第二个时可选参数,主要用于配置集合的存储上限和文档的最大数量。

第二个参数主要用于创建capped-collections,按照文档的说明是一个固定大小的集合,支持基于插入顺序插入和检索文档的高吞吐量操作,一旦集合填满了其分配的空间,它就会通过覆盖集合中最旧的文档来为新文档腾出空间。这有点类似于io操作中的缓冲区。

由于支持顺序插入,当查询的时候,就可以自动按照顺序返回文档,不需要在索引上花费额外的开销。所以可以拥有更高的高吞吐量。而由于集合大小固定,那么可以自动删除旧的文档,这种特性非常适合于日志系统,方便日志滚动保存,避免日志存储过多对服务器造成负担。

> db.product.find()

{ "_id" : ObjectId("62519ac1bd42defeee43f2af"), "name" : "玩 具 汽 车 ", "price" : 50.2 }

mongodb中存储的时bjson结构,这个就是 JSON 文档的二进制表示形式,可以看到有个_id参数,等于mysql中的主键。如果是数据库默认生成的话,那么是时间戳加机器的机器码结合计算得到的。

文档的大小默认最大值为16MB,限制文档的最大大小,能够避免过多的占用机器的资源。这些配置都是提高mongodb性能的。