2 min read

NoSQL老大-MongoDB的使用

Table of Contents

数据层级关系

mongodb 数据分为三层,分别是 db,collection,document。collection 相当于 table,document 就是一条条的 record。

安装和启动

推荐通过docker安装:

docker run -d --name mongodb -p 27017:27017 mongo

这里介绍一下mongod:mongod 是启动 MongoDB 数据库服务的命令,全称是 Mongo Daemon,是 MongoDB 运行的核心。如果你在本地开发或测试,直接运行 mongod 即可启动服务;在 Docker 中,镜像会帮你处理这一步。

mongoshell

mongodb 安装时会自带一个名为 mongosh 的 shell,而这个 shell 本质上也是一个 JavaScript 解释器。所以在里面可以直接执行 js 命令。

⚠️

在 MongoDB 8.0 版本中,启动 MongoDB Shell 的命令是 mongosh,而不是早期版本中使用的 mongo 命令。mongosh 是 MongoDB 提供的新一代 Shell 工具,从 MongoDB 4.4 开始引入,并在后续版本中逐步取代旧的 mongo Shell。

mongosh

市面上有一些 mongo 的可视化管理工具,比如官方的 MongoDB Compass,Navicat for MongoDB 等。推荐用免费的 MongoDB Compass。在我的工作中,一般在两种环境下执行mongo查询。一种是mongoshell,一种是mongodb compass。如果是在内网或者docker环境,那么只能用mongoshell。因为mongo的数据往往是嵌套结构,且json格式在记录长度较长时,整个窗口都是一坨字符,可读性很差。补救措施是在查询语句后面加上pretty(),结合projection,输出会美观些。

CRUD 和 关系型数据库的区别

Mongodb最核心的优势是它的灵活性,文档结构使得它支持嵌套数据结构。从创建数据库开始,不需要显式的声明创建,只需要use dbname,然后在你的第一个插入语句中写上:

db.users.insertOne({
  name: "Jason",
  age: 18,
  address: {
    city: "Beijing",
    street: "Beijing Road",
  },
});

这样,数据库和collection都建成了。

aggregation pipeline

聚合管道,不只有聚合操作。实际上是一个数组,每个元素为 stage,并按排列顺序执行。

db.orders.aggregate([
  // Stage 1: Filter pizza order documents by pizza size
  {
    $match: { size: "medium" },
  },

  // Stage 2: Group remaining documents by pizza name and calculate total quantity
  {
    $group: { _id: "$name", totalQuantity: { $sum: "$quantity" } },
  },
]);

查询优化

加索引。mongodb的索引原理和关系型数据库的索引原理差不多。

其次是借助explain来优化查询。在查询语句末尾加上.explain()来查看查询计划。

mongodb性能从何而来

mongodb的效率还是挺高的,但是带来的一个问题是内存占用高,也是它最为人诟病的一点。mongo运行时间越长,内存占用越高,因为它会将数据缓存在内存中。


Jason Lee
Hi, I'm Jason Lee

I hope I can still be curious about the world when I turn 60 years old.

Enjoy!

Contact me:

Email | GitHub


Content licenced under CC BY-NC-ND 4.0