分享到

简介

MongoDB 使用 面向文档的结构来存储、管理和处理数据。单个 文档被组织成集合,而集合又存储在数据库中。由于每个文档的模式不是由静态模式定义的,因此基于文档的系统比由表和记录组成的关系系统提供更大的灵活性。

在本指南中,我们将讨论如何创建和管理 MongoDB 用于组织数据的结构。我们将介绍如何创建和管理数据库,以及如何创建集合来保存相似或相关的文档。

如何查看现有数据库

在我们开始创建新数据库之前,熟悉 MongoDB 提供的一些用于查找有关现有数据库信息的方法会很有帮助。这可以帮助您在开始进行更改之前了解系统的当前状态。

要显示您可以访问的系统上的所有数据库,请使用 show dbs 方法

show dbs
admin 0.000GB
config 0.000GB
local 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.000GB
config 0.000GB
local 0.000GB

要实际创建新数据库,我们需要首先创建一些东西。

如何查看数据库中的集合

在 MongoDB 中,集合 是用于将文档分组在一起的结构,您可以使用您想要实现的任何分类系统。它们存在于数据库内部并存储文档。

您可以使用 show collections 方法查看当前使用的数据库中的可用集合。

在这里,我们将切换到 admin 数据库,该数据库有一些可用于演示的集合

use admin
show collections
system.roles
system.users
system.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 playground
db.equipment.insert({name: "slide"})
switched to db playground
WriteResult({ "nInserted" : 1 })

输出表明写入了一个文档。上面的命令执行了三个不同的操作。首先,MongoDB 创建了我们在 use 命令中引用的 playground 数据库。它还在数据库中创建了 equipment 集合,因为我们在该集合名称上调用了 insert() 命令。最后,它使用我们提供给 insert() 命令的输入在 equipment 集合中创建了实际文档。

您可以使用以下命令验证所有这些操作是否已执行

show dbs
show collections
db.equipment.count()
db.equipment.find()

输出应显示 playground 数据库现在在列出的数据库中,equipment 集合已列出,equipement 集合中有一个文档,并且该文档是我们使用命令插入的 {name: "slide"} 文档。

用于创建集合的另一个选项是显式使用 db.createCollection() 方法。这允许您创建集合而无需向其中添加任何文档。

例如,您可以通过键入以下内容在 playground 数据库中创建一个名为 maintenance.requests 的新集合

db.createCollection("maintenance.requests")
{ "ok" : 1 }

我们可以验证新集合在我们查询时显示出来,但它没有文档

show collections
db.maintenance.requests.count()
equipment
maintenance.requests
0

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
equipment
maintenance.requests

如何删除数据库

要删除整个数据库,请调用 db.dropDatabase() 命令。这将删除当前数据库,因此在执行之前请确保您位于正确的数据库上

use playground
db.dropDatabase()
switched to db playground
{ "dropped" : "playground", "ok" : 1 }

如果您检查可用数据库列表,则不再显示 playground

show dbs
admin 0.000GB
config 0.000GB
local 0.000GB

由于我们尚未切换到新数据库,因此 MongoDB 仍设置为创建 playground 数据库,如果我们选择添加新集合或文档。您可以使用 db 命令验证这一点

db
playground

结论

创建和管理数据库和集合是使用 MongoDB 时的一项重要技能。这些基本的组织工具允许您将相关文档分组在一起、查询信息子集以及为不同类型的数据设置授权策略。熟悉如何有效地管理这些结构将使您能够更有效地管理数据,并减少意外情况。

常见问题解答

是的,您可以在 MongoDB 的数据库中拥有多个集合。集合可以被认为是关系数据库中表的类似物。

没有一个命令可以删除 MongoDB 中的每个数据库,但这可以通过脚本或一系列查询来实现。

要删除数据库,基本语法如下所示

use playground
db.dropDatabase()

要在 MongoDB 中重命名集合,您可以使用 renameCollection() 方法。

基本语法如下所示

db.collectionName.renameCollection("new collection name")

其中 collectionName 是集合的当前名称,"new collection name" 是所需的更改。

您可以使用 show collections 方法显示您正在使用的数据库中的所有可用集合。

如果您想查看 admin 数据库中的所有集合,基本语法如下所示

use admin
show collections

或者,您也可以使用 db.getCollectionNames() 方法在数组中获得相同的结果。

db.getCollectionNames()
[ "system.roles", "system.users", "system.version" ]

为了将 MongoDB 与 C# 一起使用,您需要下载 C# 的兼容驱动程序版本。

下载后,您将能够使用 C# 进行读取操作,例如列出集合。

关于作者
Justin Ellingwood

Justin Ellingwood

Justin 自 2013 年以来一直撰写关于数据库、Linux、基础设施和开发者工具的文章。他目前与妻子和两只兔子住在柏林。他通常不必以第三人称写作,这对所有相关方来说都是一种解脱。