简介
MongoDB 使用 面向文档的结构来存储、管理和处理数据。单个 文档被组织成集合,而集合又存储在数据库中。由于每个文档的模式不是由静态模式定义的,因此基于文档的系统比由表和记录组成的关系系统提供更大的灵活性。
在本指南中,我们将讨论如何创建和管理 MongoDB 用于组织数据的结构。我们将介绍如何创建和管理数据库,以及如何创建集合来保存相似或相关的文档。
如果您正在使用 MongoDB,请查看 Prisma 的 MongoDB 连接器!您可以使用 Prisma Client 自信地管理生产 MongoDB 数据库。
要开始使用 MongoDB 和 Prisma,请查看我们的从零开始入门指南或如何添加到现有项目。
如何查看现有数据库
在我们开始创建新数据库之前,熟悉 MongoDB 提供的一些用于查找有关现有数据库信息的方法会很有帮助。这可以帮助您在开始进行更改之前了解系统的当前状态。
要显示您可以访问的系统上的所有数据库,请使用 show dbs
方法
show dbs
admin 0.000GBconfig 0.000GBlocal 0.000GB
MongoDB 将响应系统上所有可访问数据库的名称以及它们当前存储空间的摘要。
要查看您当前设置为操作的数据库,请使用 db.getName()
命令或其简写别名 db
db
test
您可能会发现您当前正在使用的数据库未在 show dbs
命令中列出。这是因为在 MongoDB 中,在您将第一个文档写入数据库之前,数据库实际上并未创建。因此,在上面的示例输出中,shell 已准备好对 test
数据库进行操作,但由于它尚不存在,因此不会被 show dbs
命令返回。
要切换到不同的数据库,您可以使用 use
命令
use admin
switched to db admin
要获取有关当前数据库的一些基本信息,您可以使用 db.stats()
方法
db.stats()
{"db" : "admin","collections" : 3,"views" : 0,"objects" : 4,"avgObjSize" : 278.25,"dataSize" : 1113,"storageSize" : 86016,"indexes" : 5,"indexSize" : 147456,"totalSize" : 233472,"scaleFactor" : 1,"fsUsedSize" : 2876923904,"fsTotalSize" : 25832407040,"ok" : 1}
输出显示有关数据库中集合数量、存储统计信息、索引信息等的信息。
如何创建数据库
MongoDB 没有用于创建新数据库的显式命令。相反,如前所述,您必须向 MongoDB 指示您想要将新文档写入新数据库。当这些文档被创建时,它们将隐式地创建数据库。
要准备 MongoDB 以写入新数据库,请发出 use
命令以切换到不存在的数据库。
在这里,我们将设置 MongoDB 以创建一个名为 playground
的新数据库
use playground
switched to db playground
如果您检查当前数据库,它将确认 playground
数据库当前是数据库相关命令的目标
db
playground
但是,如前所述,由于我们尚未创建任何文档,因此数据库本身尚未创建
show dbs
admin 0.000GBconfig 0.000GBlocal 0.000GB
要实际创建新数据库,我们需要首先创建一些东西。
如何查看数据库中的集合
在 MongoDB 中,集合 是用于将文档分组在一起的结构,您可以使用您想要实现的任何分类系统。它们存在于数据库内部并存储文档。
您可以使用 show collections
方法查看当前使用的数据库中的可用集合。
在这里,我们将切换到 admin
数据库,该数据库有一些可用于演示的集合
use adminshow collections
system.rolessystem.userssystem.version
或者,您可以使用 db.getCollectionNames()
方法在数组中检索相同的集合名称
db.getCollectionNames()
[ "system.roles", "system.users", "system.version" ]
要显示有关当前数据库中集合的更多信息,请使用 db.getCollectionInfos()
方法
db.getCollectionInfos()
[{"name" : "system.roles","type" : "collection","options" : {},"info" : {"readOnly" : false,"uuid" : UUID("776b1fd7-6014-4191-b33c-21350b590627")},"idIndex" : {"v" : 2,"key" : {"_id" : 1},"name" : "_id_"}},{"name" : "system.users","type" : "collection","options" : {},"info" : {"readOnly" : false,"uuid" : UUID("8c824fd1-2150-4413-8fac-0b77d16505e5")},"idIndex" : {"v" : 2,"key" : {"_id" : 1},"name" : "_id_"}},{"name" : "system.version","type" : "collection","options" : {},"info" : {"readOnly" : false,"uuid" : UUID("7501483a-45cc-492e-a1fd-ccb4349650cb")},"idIndex" : {"v" : 2,"key" : {"_id" : 1},"name" : "_id_"}}]
您还可以选择将文档传递给命令以过滤结果。例如,如果您只对查看有关 system.version
集合的信息感兴趣,您可以键入
db.getCollectionInfos({name: "system.version"})
[{"name" : "system.version","type" : "collection","options" : {},"info" : {"readOnly" : false,"uuid" : UUID("7501483a-45cc-492e-a1fd-ccb4349650cb")},"idIndex" : {"v" : 2,"key" : {"_id" : 1},"name" : "_id_"}}]
要检查一个集合包含多少文档,请使用 db.<collection>.count()
方法。例如,以下命令检查 system.users
集合中有多少文档
db.system.users.count()
2
要查看有关当前数据库中集合的基本统计信息,请使用 db.printCollectionStats()
方法
db.printCollectionStats()
该命令可能会输出比您容易理解的更多信息,但包含信息,但在某些需要深入了解集合特征的场景中很有帮助。
如何创建集合
要创建新集合,有两种选择:您可以隐式或显式地创建集合。
与数据库一样,MongoDB 可以在首次将文档写入集合时自动创建集合。此方法告诉 MongoDB 通过将文档插入尚不存在的集合来创建新集合。
例如,我们可以切换回我们之前感兴趣的 playground
数据库。一旦我们进入该命名空间,我们可以通过在我们要用于新集合的名称上调用 insert.()
命令,将新文档插入到集合中。在这里,我们可以在名为 equipment
的新集合中创建一个关于幻灯片的文档
use playgrounddb.equipment.insert({name: "slide"})
switched to db playgroundWriteResult({ "nInserted" : 1 })
输出表明写入了一个文档。上面的命令执行了三个不同的操作。首先,MongoDB 创建了我们在 use
命令中引用的 playground
数据库。它还在数据库中创建了 equipment
集合,因为我们在该集合名称上调用了 insert()
命令。最后,它使用我们提供给 insert()
命令的输入在 equipment
集合中创建了实际文档。
您可以使用以下命令验证所有这些操作是否已执行
show dbsshow collectionsdb.equipment.count()db.equipment.find()
输出应显示 playground
数据库现在在列出的数据库中,equipment
集合已列出,equipement
集合中有一个文档,并且该文档是我们使用命令插入的 {name: "slide"}
文档。
用于创建集合的另一个选项是显式使用 db.createCollection()
方法。这允许您创建集合而无需向其中添加任何文档。
例如,您可以通过键入以下内容在 playground
数据库中创建一个名为 maintenance.requests
的新集合
db.createCollection("maintenance.requests")
{ "ok" : 1 }
我们可以验证新集合在我们查询时显示出来,但它没有文档
show collectionsdb.maintenance.requests.count()
equipmentmaintenance.requests0
db.createCollection()
方法主要有用,因为它允许您在创建时指定各种选项。例如,我们可能想要创建一个 *capped collection*,这是一个集合,它通过在已满时删除其最旧的文档来维护对其分配大小的上限。
要创建一个名为 notifications
的 capped collection,它最多可以存储 10240 字节的信息,您可以调用
db.createCollection("notifications",{capped: true,size: 10240})
{ "ok" : 1}
这将创建一个 capped notification
集合,我们可以通过键入以下内容来验证
db.getCollecitonInfos({"options.capped": true})
[{"name" : "notifications","type" : "collection","options" : {"capped" : true,"size" : 10240},"info" : {"readOnly" : false,"uuid" : UUID("dff7bfb0-1cfc-4170-ba60-fbb834ac6925")},"idIndex" : {"v" : 2,"key" : {"_id" : 1},"name" : "_id_"}}]
如何删除集合
要删除集合,您可以在集合本身上使用 drop()
方法。
例如,要删除我们创建的 capped notifications
集合,您可以键入
db.notifications.drop()
true
您可以通过再次列出当前数据库中的集合来验证操作是否成功
show collections
equipmentmaintenance.requests
如何删除数据库
要删除整个数据库,请调用 db.dropDatabase()
命令。这将删除当前数据库,因此在执行之前请确保您位于正确的数据库上
use playgrounddb.dropDatabase()
switched to db playground{ "dropped" : "playground", "ok" : 1 }
如果您检查可用数据库列表,则不再显示 playground
show dbs
admin 0.000GBconfig 0.000GBlocal 0.000GB
由于我们尚未切换到新数据库,因此 MongoDB 仍设置为创建 playground
数据库,如果我们选择添加新集合或文档。您可以使用 db
命令验证这一点
db
playground
结论
创建和管理数据库和集合是使用 MongoDB 时的一项重要技能。这些基本的组织工具允许您将相关文档分组在一起、查询信息子集以及为不同类型的数据设置授权策略。熟悉如何有效地管理这些结构将使您能够更有效地管理数据,并减少意外情况。
如果您正在使用 MongoDB,请查看 Prisma 的 MongoDB 连接器!您可以使用 Prisma Client 自信地管理生产 MongoDB 数据库。
要开始使用 MongoDB 和 Prisma,请查看我们的从零开始入门指南或如何添加到现有项目。
常见问题解答
是的,您可以在 MongoDB 的数据库中拥有多个集合。集合可以被认为是关系数据库中表的类似物。
要在 MongoDB 中重命名集合,您可以使用 renameCollection()
方法。
基本语法如下所示
db.collectionName.renameCollection("new collection name")
其中 collectionName
是集合的当前名称,"new collection name"
是所需的更改。
您可以使用 show collections
方法显示您正在使用的数据库中的所有可用集合。
如果您想查看 admin
数据库中的所有集合,基本语法如下所示
use adminshow collections
或者,您也可以使用 db.getCollectionNames()
方法在数组中获得相同的结果。
db.getCollectionNames()
[ "system.roles", "system.users", "system.version" ]