理解 MongoDB 基础的最佳方式是掌握以下比较
MongoDB | 传统 SQL |
---|---|
数据库 | 数据库 |
集合 | 表 |
文档 | 行 |
$lookup | 连接 |
索引 | 索引 |
ACID 事务 | ACID 事务 |
单机 | 多节点 |
在传统的关系型 SQL 数据库(例如 MySQL、PostgreSQL)中,表用于定义数据集的结构,行用于实际的数据,而在 MongoDB 中,我们拥有集合和包含键值对的文本文档,分别对应。换句话说,在关系型数据库中,表通过键相关联,而在 MongoDB 中,集合包含非结构化和通常是任意的数据。
索引是高效查询执行的基本功能,MongoDB 支持在文档的任何字段或子字段上创建索引,并且它们在集合级别定义。
一个 集合 包含多个文档,一个 文档 包含数据字段。数据字段的数量和类型可以任意,即使在同一集合中也是如此。实际上,每个 MongoDB 文档都遵循 JavaScript 对象表示法(JSON)格式。一个文档的示例是
MongoDB 可以处理动态数据模型和模式,可以轻松存储 非结构化数据集;在数据负载可变的情况下,MongoDB 可以横向扩展,与传统 SQL 数据库相比,这极具成本效益,因为传统 SQL 数据库通常只能纵向扩展。
有几种方式可以 安装 MongoDB。最有效的方法是使用 MongoDB 数据库即服务(Database-as-a-Service)产品 MongoDB Atlas。这是一个可以通过您喜欢的网页浏览器访问的服务;它可以安装在所有三个主要的公共云提供商(Amazon Web Services、Microsoft Azure、Google Cloud Platform)上,提供 免费 阶段,只需点击几下,您就可以配置一个完全可用的 MongoDB 数据库。
要开始在 MongoDB Atlas 上进行设置,您只需要 创建一个账户。
创建账户后,您需要 创建一个项目
然后,创建实际的 MongoDB 集群
选择您首选的云提供商,为您的集群提供一个名称,然后点击 创建集群
集群创建后,让我们配置安全选项。我们需要配置的两件事是 IP 白名单地址和数据库用户。
对于 IP 白名单,点击“添加当前 IP 地址”,然后选择您将记住的用户名/密码。在下一页上,选择“使用 mongo shell 连接”,因为这是我们将在整个教程中使用的工具。如果您还没有安装 mongo shell,请按照以下说明操作
要连接到MongoDB集群,您还可以使用官方的MongoDB图形界面客户端,名为Compass。您可以从MongoDB下载页面下载MongoDB Compass:页面。安装应用程序后,您可以通过在上面的窗口中提供连接字符串中的主机名以及用户名和密码来连接到MongoDB Atlas集群。打开Compass后,点击“单独填写连接详细信息”然后点击“连接”
或者,您可以在工作站上下载并安装MongoDB社区版或企业版。如果您是第一次尝试MongoDB,那么强烈推荐使用MongoDB Atlas,因为它可以快速轻松地配置免费集群。
如果您已经使用了MongoDB Atlas,您可以从集群主页轻松检查集群的状态
如果您在Windows、MacOS或Linux个人工作站上安装了MongoDB社区版,您需要检查本地主机上是否运行了相应的mongod进程,具体取决于您的操作系统特定的命令。
一旦MongoDB Atlas为您配置了MongoDB数据库,您就可以开始探索MongoDB的功能了。
根据您的喜好,您有几个选项可以用来与您刚刚创建的数据库进行交互
对于解释性任务,使用MongoDB Atlas网络UI是个好主意,但如果您的目的是自动将文档加载到MongoDB,那么切换到编程语言将是一个更好的选择,因为它会提供更大的控制。
如果您是MongoDB的新手,那么使用MongoDB Atlas是最简单的解决方案,因为它不需要您下载任何额外的驱动程序或设置连接字符串。
如上所述,一旦您选择了首选的交互选项,创建您的第一个MongoDB集合非常简单。如果您使用MongoDB Atlas,那么GUI会引导您完成此操作。例如,如果您选择使用mongo shell,创建集合就像打开命令行、连接到mongo并执行以下命令一样简单:
$ > db.createCollection('myFirstCollection');
然后,为了插入您的第一个文档,使用insertOne命令动态创建JSON文档。在同一个命令行中运行:
$ > db.myFirstCollection.insertOne({ firstName: 'John', surname: 'Doe', department: 'HR' });
MongoDB会自动将文档以二进制格式存储,这大大加快了检索和访问速度;这种格式称为BSON(二进制JSON)。
此外,对于每个集合,MongoDB都保留了一个名为_id
的字段,也称为id字段
。该字段是任何集合的主键,并唯一标识任何集合中的一个文档。当您在集合中插入一个文档而没有指定_id时,MongoDB会为您填充Mongo ObjectId值。或者,您可以选择使用一个或多个自定义值指定自定义主键。
从MongoDB集合中筛选特定记录是可能的。MongoDB支持所有常见的过滤器运算符,如数值和字符串查询比较。例如
db.inventory.find( { qty: { $gt: 20 } } )
在这个查询中,我们从库存集合中过滤记录,只返回当它们的 qty
数据字段大于20的文档,使用 $gt
比较查询运算符。同样
db.inventory.find( { qty: { $in: [ 5, 15 ] } } )
在这个查询中,我们也在相同的集合中过滤记录,只返回当它们的 qty
数据字段等于5或15的文档,使用 $in
比较查询运算符。
可以在MongoDB集合上执行许多操作。MongoDB支持常见的查询和投影运算符。例如,在下面的查询中,我们使用了三个不同的运算符
db.inventory.find( { $and: [ { price: { $eq: 2.00 } }, { price: { $exists: true } } ] } )
在这个查询中,我们从库存集合中过滤记录。我们使用逻辑运算符 $and
来仅获取具有 price
数据字段(($exists)
)并且等于2.00(($eq)
)的文档。
MongoDB还支持更新运算符。正如其名所示,如果您想对文本文档执行更新,这些运算符非常有用。例如,您可以使用 $set
更新 products
集合中的文档,如下所示
db.products.update(
{ _id: 100 },
{ $set:
{
quantity: 500
}
}
)
上述查询假设您已经在 products
集合中有一个具有 _id: 100
和 quantity
字段的文档
{
_id: 100,
sku: "abc123",
quantity: 250,
instock: true,
reorder: false,
details: { model: "14Q2", make: "xyz" },
tags: [ "apparel", "clothing" ],
ratings: [ { by: "ijk", rating: 4 } ]
}
想象一下,您拥有一家百货商店并想捕捉每个商品每月的销售情况。这是一个可以在配置的MongoDB集合中插入新数据时自动配置的聚合。此外,MongoDB Atlas提供了使用MongoDB Charts添加解释性可视化的能力,包括添加柱状图、折线图,甚至像热力图、散点图或地理空间图这样的地理空间图表。
MongoDB教程页面和MongoDB大学都是非常好的起点,可以应用上述所有内容。此外,您还将学到更多可以帮助您或您所在公司前进的激动人心的事情。
当您有MongoDB工作负载时,有一些建议可以帮助MongoDB数据库以最有效的方式工作。一般来说,为关键集合配置索引总是一个好主意。如果您的查询使用特定字段,那么MongoDB引擎不需要遍历每个文档来获取结果。相反,它将根据定义的索引知道在哪里查找,从而大大减少检索时间。这对于大集合或预计未来会增长的集合非常有用。
此外,在MongoDB数据库的早期阶段,还有两个需要考虑的因素:副本集和分片。如果启用了这些功能之一,MongoDB通常也被称为MongoDB集群
副本集:当MongoDB创建数据的副本并将它们存储在其他服务器上时,这就是副本集。该功能在MongoDB数据库的主要服务器失败或进行维护时提供安全网;它切换到其他服务器来为最终用户提供数据。这是一个无缝的操作;在MongoDB Atlas的免费层中,默认自动配置了3个服务器的副本集。
分片:这是另一个受益于拥有多个机器的功能。MongoDB数据库的分片是横向扩展的同义词。分片是将集合文档分布在多个实例或“分片”中,当预期数据增长时非常有用。