分享到

简介

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

在本指南中,我们将讨论如何创建和管理 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
}

输出显示了有关数据库中集合数量、存储统计信息、索引信息等的 information。

如何创建数据库

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() 方法主要有用,因为它允许您在创建时指定各种选项。例如,我们可能希望创建一个 *受限集合*,它是一个集合,它在分配的大小上保持上限,它通过删除最旧的文档来存储它,以防存储空间已满。

要创建一个名为 notifications 的受限集合,该集合最多可以存储 10240 字节的信息,您可以调用

db.createCollection(
"notifications",
{
capped: true,
size: 10240
}
)
{ "ok" : 1}

这将创建一个受限的 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() 方法。

例如,要删除我们创建的受限 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、基础设施和开发人员工具的文章。他现在与妻子和两只兔子住在柏林。他通常不必以第三人称写作,这对所有相关方来说都是一种解脱。