MongoDB 是一个丰富的面向文档的 NoSQL 数据库。

在本文中,我会分享一些有关 MongoDB 命令的基本知识,例如查询、过滤数据、删除、更新等等。

好的,我们开始吧!

image

配置

为了使用 MongoDB,首先需要在计算机上安装 MongoDB。为此,请访问官方下载中心,下载适用于你的操作系统的版本。在这篇文章里,我会以 Windows 为例。

下载 MongoDB 社区服务器设置后,你将依次点击“下一个”完成安装。完成后,转到安装了 MongoDB 的 C 驱动器。打开程序文件,然后选择 MongoDB 目录。

C: -> Program Files -> MongoDB -> Server -> 4.0(version) -> bin

在 bin 目录中,你会发现几个有趣的可执行文件。

  • mongod
  • mongo

我们看一下这两个文件。

mongod 代表“ Mongo Daemon”。mongod 是 MongoDB 使用的后台进程。mongod 的主要目的是管理所有 MongoDB 服务器任务,例如:接受请求,响应客户端和内存管理。

mongo 是可以与客户端(例如,系统管理员和开发人员)进行交互的命令行外壳。

现在,让我们看看如何启动和运行该服务器。在 Windows 上,首先需要在 C 驱动器中创建几个目录。在 C 驱动器中打开命令提示符,然后执行以下操作:

C:\> mkdir data/dbC:\> cd dataC:\> mkdir db

这些目录的目的是 MongoDB 需要一个文件夹来存储所有数据。MongoDB 的默认数据目录路径是驱动器上的 /data/db。因此,有必要像这样提供这些目录。

如果启动不带这些目录的 MongoDB 服务器,则可能会看到以下错误:

r04FRmRGqKUaclGh4ZDo3YsMwOlXMVm2T3bJ
尝试启动 mongodb 服务器,不含 \data\db 目录

创建完这两个文件后,再次转到 mongodb 目录中的 bin 文件夹,然后打开其中的 shell。运行以下命令:

mongod

瞧! 现在,我们的 MongoDB 服务器已启动并正在运行!?

为了使用此服务器,我们需要一个中介器。在 bind 文件夹中打开另一个命令窗口,然后运行以下命令:

mongo

运行此命令后,导航到运行 mongod 命令的外壳程序(这是我们的服务器)。你会在最后看到“接受连接”消息。这意味着我们的安装和配置成功!

只需在 mongo shell 中运行即可:

db
TK2JGg4JXAj0eG9JBzl89ABEF3JuKAwnw2dx
最初你有一个 db 叫作 ‘test’

配置环境变量

为了节省时间,你可以设置环境变量。在 Windows 中,通过以下菜单完成:

Advanced System Settings -> Environment Variables -> Path(Under System Variables) -> Edit

只需复制我们的 bin 文件夹的路径,然后运行它。在我的这个示例里,是这样的:

C:\Program Files\MongoDB\Server\4.0\bin

现在你就完成设置了!

使用 MongoDB

大量的 GUI 图形用户界面(例如 MongoDB Compass,Studio 3T 等)可和 MongoDB  服务器一起使用。

它们提供了图形界面,因此你可以轻松地使用数据库并执行查询,而无需使用 Shell 并手动键入查询。

但是在本文中,我们将使用命令提示符来完成工作。

现在我们深入研究 MongoDB 命令,这些命令将帮助你在将来的项目中使用。

  • 打开命令提示符,然后键入 mongod 以启动 MongoDB 服务器。
  • 打开另一个外壳,然后键入 mongo 以连接到 MongoDB 数据库服务器。

1. 确定你目前在哪个数据库

db
o6puQoPSpGCW8-AgizHzAv3Qpywtzsgwd26N

此命令将显示你当前所在的数据库。test 是默认情况下的初始数据库。

2. 罗列数据库

show databases
Q-G8NzP5OAXh0Y3OfdOtqFxlFG-tLErPlPSi

我目前有四个数据库:CrudDBadminconfiglocal

3. 访问某个数据库

use <your_db_name>
UIRueBuX-r6nRXA-qd6Uv95IBd0UbhVvMZtZ

在这里,我已移至 local 数据库。你可以使用命令 db 打印出当前数据库的名称,进行检查。

4. 创建一个数据库

使用 RDBMS(关系数据库管理系统),我们可以获得数据库、表、行和列。

但是,在 NoSQL 数据库(例如 MongoDB)中,数据以 BSON 格式(JSON 的二进制版本)存储。它们存储在称为“集合”的结构中。

在 SQL 数据库中,这些类似于表。

e7ygVKXaPcqcqCyvurAeUzAbmmREoA6p72V2
oxeGaPqbZ2pmmZx3WcDo8CXIL4J09PbecBWW
SQL terms and NoSQL terms by Victoria Malaya

接下来,我们谈谈如何在 mongo shell 中创建数据库。

use <your_db_name>

等一下,我们之前有这个命令! 为什么我再次使用它?

在 MongoDB 服务器中,如果你的数据库已经存在,则使用该命令将导航到你的数据库。

但是,如果数据库尚不存在,则 MongoDB 服务器将为你创建数据库。然后,它将导航到其中。

创建新数据库后,运行 show database 命令将不会显示你新创建的数据库。这是因为,当数据库包含一些数据(文档)后,它才会显示在你的数据库列表中。

5. 创建一个集合

使用 use 命令导航到新创建的数据库。

实际上,有两种创建集合的方法。

一种方法是将数据插入到集合中:

db.myCollection.insert({"name": "john", "age" : 22, "location": "colombo"})

即使该集合不存在,这也将创建你的集合 myCollection。然后它将插入带有 nameage 的文档。这些是无上限的集合。

第二种方法如下所示:

2.1 创建一个无上限的集合

db.createCollection("myCollection")

2.2 创建一个有上限的集合

db.createCollection("mySecondCollection", {capped : true, size : 2, max : 2})

这样,你将无需插入数据即可创建集合。

“有上限的集合”规定了最大的文档数,可防止文档溢出。在此示例中,我通过将其值设置为 true 启用上限。

size : 2 表示限制为 2MB,max: 2 将最大文档数设置为 2。

现在,如果你尝试在 mySecondCollection 中插入两个以上的文档,并使用 find  命令(我们将在稍后讨论),你只会看到最近插入的文档。请记住,这并不意味着第一个文档已被删除——它只是未显示。

6. 插入数据

我们可以将数据插入到新集合或之前创建的集合中。

uO4agHbI85kMJrQmF1L9pMmhn0WcgngmoPsI
数据存储在 JSON 中

有三种插入数据的方法:

  • insertOne() 仅用于插入单个文档
  • insertMany() 用于插入多个文档
  • insert() 用于插入所需数量的文档

下面是一些示例:

  • insertOne()
db.myCollection.insertOne(
  {
    "name": "navindu", 
    "age": 22
  }
)
  • insertMany()
db.myCollection.insertMany([
  {
    "name": "navindu", 
    "age": 22
  },
  {
    "name": "kavindu", 
    "age": 20
  },

  {
    "name": "john doe", 
    "age": 25,
    "location": "colombo"
  }
])

insert() 方法类似于 insertMany() 方法。

另外,请注意,我们在文档中为 John Doe 插入了一个名为 location 的新属性。因此,如果你使用 find,则只会看到 john doe 具有 location 属性。

对于 NoSQL 数据库(例如 MongoDB),这可能是一个优势,有利于可扩展性。

QyCgwWUHWoporNunUvoRgdVry-x0QyA8qSxd
成功插入数据

7. 查询数据

你可以通过以下方法查询集合中的所有数据:

db.myCollection.find()
rzcViLqDrTy5gqSFoY6n3N7dciNxFTY62eRL
结果

如果你想通过更清晰的方式查看此数据,只需在其末尾添加 .pretty() 即可。这将以漂亮的 JSON 格式显示文档。

db.myCollection.find().pretty()
gMIbpNqjr9jmJ3YVDZruX1skX0PCvSruuZWB
结果

等等,在这些示例中,你是否注意到了类似 _id 的东西?

无论何时插入文档,MongoDB 都会自动添加一个 _id 字段。该字段唯一地标识每个文档。如果你不想显示它,只需运行以下命令:

db.myCollection.find({}, _id: 0).pretty()

接下来,我们看一下过滤数据。

如果要显示某些特定文档,则可以指定要显示的文档的单个详细信息。

db.myCollection.find(
  {
    name: "john"
  }
)
TiBBNNp9gmxtPXaHd5BSZ7MkSrv1JkRzkMI1
结果

假设你只想显示年龄在 25 岁以下的人。您可以使用 $lt 对此进行过滤。

db.myCollection.find(
  {
    age : {$lt : 25}
  }
)

同样,$gt 表示大于,$lte 表示“小于或等于”,$gte 表示“大于或等于”,$ne 是“不等于”。

8. 更新文档

假设你想更新某人的地址或年龄,该怎么做? 请看下一个例子:

db.myCollection.update({age : 20}, {$set: {age: 23}})

第一个参数是要更新哪个文档的字段。在这里,我为简单起见指定了 age。在生产环境中,你可以使用 _id 字段。

最好使用 _id 之类的内容来更新特定的一行。 这是因为多个字段可以具有相同的年龄和名称。 因此,如果更新一行,它将影响具有相同名称和年龄的所有行。

qQH53vM6-peOzS-z9k5YjMoS9R2z1APJrXvB
结果

如果你使用新属性(例如 location)更新文档,则文档将使用新属性进行更新。如果你执行 find,那么结果是:

YqJpPAw7d5NPSTzStCevUmgoDTm6FkgPLZ-7
结果

如果你需要从单个文档中删除某个属性,则可以执行以下操作(假设你希望删除 age):

db.myCollection.update({name: "navindu"}, {$unset: age});

9. 删除一个文档

如前所述,当你更新或删除文档时,你只需要指定 _id 即可,而不是 nameagelocation

db.myCollection.remove({name: "navindu"});

10. 删除一个集合

db.myCollection.remove({});

注意,这不等于 drop() 方法。不同之处在于 drop() 用于删除集合中的所有文档,而 remove() 方法用于删除集合本身以及所有文档。

逻辑运算符

MongoDB 提供逻辑运算符。下图总结了不同类型的逻辑运算符。

xO27jGeclafiAUt0a0VYRifhDpISvZcIkhRD
VsHbrchxUETWqCFhZc6QvmSPUdrbfOHYEH3L
参考:MongoDB 手册

假设你要显示年龄小于 25 岁且位置在科伦坡的人,怎么做呢?

我们可以使用 $and 运算符!

db.myCollection.find({$and:[{age : {$lt : 25}}, {location: "colombo"}]});

最后,我们来谈谈聚合。

聚合

快速看一下我们了解到的有关 SQL 数据库中聚合函数的知识:

JHcuA7YLBiFiCBn1QiOS8NYCUELbGg-LKDSN
SQL 数据库中的聚合函数,参考:Tutorial Gateway

简而言之,聚合对多个文档中的值进行分组并以某种方式进行汇总。

想象一下,如果我们在 recordBook 集合中有男女学生,而我们希望每个学生都有总数。为了获得男生和女生的总和,我们可以使用 $group 聚合函数。

db.recordBook.aggregate([
  {
    $group : {_id : "$gender", result: {$sum: 1}}
  }  
]);
NeK7Wx3lQ1AaUhGD1VERqmaluAl9qrsXpDMs
结果

总结

我们讨论了 MongoDB 基础,将来构建应用程序时可能需要用到。希望你喜欢这篇文章。谢谢阅读!

如果你对此教程有任何疑问,请随时在下面的评论部分中进行评论,或者在 Facebook TwitterInstagram 上与我联系。

下篇再见! ❤️✌

原文:How to get started with MongoDB in 10 minutes,作者:Navindu Jayatilake