MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

MongoDB创建数据库及显示数据库详解

2022-05-176.2k 阅读

MongoDB数据库基础概念

在深入探讨如何创建和显示MongoDB数据库之前,我们先来回顾一些基础概念。MongoDB是一个面向文档的非关系型数据库管理系统,它以BSON(Binary JSON)格式存储数据。与传统的关系型数据库(如MySQL)不同,MongoDB没有预定义的模式,这使得数据的存储和处理更加灵活。

数据库在MongoDB中是一个独立的逻辑容器,它可以包含多个集合(类似于关系型数据库中的表),每个集合又可以包含多个文档(类似于关系型数据库中的行)。一个MongoDB实例可以承载多个数据库,每个数据库都有自己独立的权限控制和存储结构。

MongoDB创建数据库

使用mongo shell创建数据库

MongoDB提供了一个交互式的JavaScript shell,称为mongo shell,通过它可以方便地与MongoDB实例进行交互,创建数据库是其中一项基本操作。

要在mongo shell中创建数据库,首先需要启动mongo shell。假设MongoDB服务已经在本地默认端口27017上运行,在命令行中输入以下命令即可启动mongo shell:

mongo

启动后,会进入mongo shell的命令提示符环境,显示类似以下内容:

MongoDB shell version v4.4.11
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx") }
MongoDB server version: 4.4.11

在mongo shell中,使用use命令来切换或创建数据库。如果指定的数据库不存在,use命令会创建该数据库。例如,要创建一个名为myDatabase的数据库,可以执行以下命令:

use myDatabase

执行上述命令后,mongo shell会输出如下信息:

switched to db myDatabase

这表明已经切换到了myDatabase数据库,如果该数据库之前不存在,此时它就被创建了。不过需要注意的是,仅仅执行use命令创建数据库后,数据库并不会真正在磁盘上占用空间,直到向该数据库插入数据。

通过编程语言驱动创建数据库

除了使用mongo shell,我们还可以通过各种编程语言的MongoDB驱动程序来创建数据库。以Python为例,使用pymongo库来操作MongoDB。

首先,确保已经安装了pymongo库。可以使用pip进行安装:

pip install pymongo

以下是通过Python代码创建数据库的示例:

import pymongo

# 创建MongoDB客户端,连接到本地默认实例
client = pymongo.MongoClient('mongodb://127.0.0.1:27017/')

# 创建数据库
db = client['myDatabase']

print(db)

在上述代码中,首先通过pymongo.MongoClient创建了一个MongoDB客户端连接到本地默认实例。然后通过访问client对象的字典属性来创建或获取名为myDatabase的数据库。如果该数据库不存在,会在首次向其插入数据时被创建。

在Java中,使用mongodb-driver-sync库来创建数据库。首先在pom.xml文件中添加依赖:

<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongodb-driver-sync</artifactId>
    <version>4.4.0</version>
</dependency>

以下是Java代码示例:

import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoDatabase;

public class CreateDatabaseExample {
    public static void main(String[] args) {
        // 创建MongoDB客户端,连接到本地默认实例
        MongoClient mongoClient = MongoClients.create("mongodb://127.0.0.1:27017");

        // 创建数据库
        MongoDatabase database = mongoClient.getDatabase("myDatabase");

        System.out.println(database);
    }
}

在这段Java代码中,通过MongoClients.create方法创建了一个MongoDB客户端连接到本地实例。然后通过getDatabase方法获取或创建名为myDatabase的数据库。同样,数据库在首次插入数据时才会真正创建在磁盘上。

MongoDB显示数据库

使用mongo shell显示数据库

在mongo shell中,可以使用show dbs命令来显示当前MongoDB实例中的所有数据库。执行该命令后,会列出所有数据库及其占用空间信息,示例输出如下:

> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB

这里列出了MongoDB实例中的几个默认数据库。admin数据库用于管理操作,config数据库用于存储分片配置信息(在分片集群环境中),local数据库用于存储本地数据,如复制集的操作日志等。

如果之前通过use命令创建了myDatabase数据库,但还未向其中插入数据,执行show dbs命令时不会显示myDatabase,因为它还未在磁盘上占用空间。当向myDatabase中插入数据后,再次执行show dbs命令,就会看到myDatabase及其占用空间信息。

通过编程语言驱动显示数据库

在Python中,使用pymongo库获取所有数据库名称的示例代码如下:

import pymongo

client = pymongo.MongoClient('mongodb://127.0.0.1:27017/')

# 获取所有数据库名称
database_names = client.list_database_names()

print(database_names)

上述代码通过client.list_database_names方法获取了当前MongoDB实例中的所有数据库名称,并打印输出。

在Java中,使用mongodb - driver - sync库获取所有数据库名称的示例代码如下:

import com.mongodb.client.MongoClients;
import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoIterable;
import org.bson.Document;

public class ListDatabasesExample {
    public static void main(String[] args) {
        MongoClient mongoClient = MongoClients.create("mongodb://127.0.0.1:27017");

        // 获取所有数据库
        MongoIterable<Document> databases = mongoClient.listDatabases();

        for (Document database : databases) {
            System.out.println(database.getString("name"));
        }
    }
}

在这段Java代码中,通过mongoClient.listDatabases方法获取了所有数据库的信息,然后遍历输出每个数据库的名称。

MongoDB数据库命名规则

MongoDB数据库命名有一些规则需要遵循:

  1. 名称长度限制:数据库名称的长度不能超过64字节。这是因为在某些文件系统中,数据库名称会作为目录名使用,而不同文件系统对目录名长度有限制,MongoDB为了兼容性统一设置为64字节。
  2. 字符限制:数据库名称只能包含ASCII字符,并且不能包含以下字符:空格.$/\"。这些字符在MongoDB中有特殊用途,例如$常用于系统集合和命令,/\是文件系统路径分隔符,为了避免混淆和保证数据库名称的规范性,不允许在数据库名称中使用。
  3. 系统保留字:数据库名称不能以system.开头,因为这是MongoDB保留用于系统数据库和集合的前缀。例如,system.namespaces是一个系统集合,用于存储命名空间信息。

数据库的权限管理与创建显示操作的关系

在MongoDB中,权限管理对于数据库的创建和显示操作有着重要影响。

默认情况下,MongoDB在没有开启身份验证时,任何连接到MongoDB实例的客户端都可以创建数据库和执行显示数据库操作。然而,当开启身份验证后,用户需要具有相应的权限才能进行这些操作。

例如,要创建数据库,用户需要在admin数据库上具有userAdminAnyDatabasedbAdminAnyDatabase权限。userAdminAnyDatabase权限允许用户管理任何数据库的用户,而dbAdminAnyDatabase权限允许用户管理任何数据库,包括创建、删除数据库等操作。

在显示数据库操作方面,用户需要具有readAnyDatabase权限才能查看所有数据库列表。如果用户没有该权限,执行显示数据库操作时会收到权限不足的错误。

以下是在mongo shell中创建具有数据库管理权限用户的示例:

// 切换到admin数据库
use admin
// 创建用户
db.createUser({
    user: "adminUser",
    pwd: "adminPassword",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
})

创建用户后,在连接MongoDB实例时需要提供用户名和密码进行身份验证:

mongo -u adminUser -p adminPassword --authenticationDatabase admin

数据库创建和显示操作在不同部署架构下的差异

单机部署

在单机部署的MongoDB环境中,创建和显示数据库的操作相对简单直接。无论是通过mongo shell还是编程语言驱动,操作流程与前文所述基本一致。单机环境下没有复制集或分片集群带来的额外复杂性,数据库的创建和显示操作直接作用于本地的MongoDB实例。

复制集部署

在复制集部署架构中,虽然数据库的创建和显示操作的基本语法不变,但背后的机制有所不同。复制集由多个MongoDB节点组成,其中一个节点为主节点(Primary),其他为从节点(Secondary)。

当通过mongo shell或驱动在复制集中创建数据库时,该操作首先在主节点上执行。主节点会记录该操作到其操作日志(oplog)中,然后从节点会通过复制机制同步主节点的oplog,从而在从节点上也创建相同的数据库。

在显示数据库操作时,无论是连接到主节点还是从节点执行show dbs命令或通过驱动获取数据库列表,得到的结果都是一致的。这是因为从节点会定期与主节点同步数据,包括数据库的元数据信息。

分片集群部署

分片集群部署架构更为复杂,它由多个分片(Shard)、配置服务器(Config Server)和路由服务器(mongos)组成。

当在分片集群中创建数据库时,路由服务器(mongos)接收到创建数据库的请求后,会将该请求转发到相关的配置服务器。配置服务器会记录数据库的元数据信息,包括数据库所属的分片等信息。然后,mongos会根据配置服务器的信息,将后续的数据插入请求分发到相应的分片上。

在显示数据库操作时,mongos会从配置服务器获取数据库的元数据信息,并返回数据库列表。由于分片集群的分布式特性,数据库可能分布在多个分片上,但对于用户来说,通过mongos进行数据库创建和显示操作时,感觉与单机环境类似,操作的透明性得到了保证。

总结与注意事项

通过上述内容,我们详细了解了MongoDB中创建数据库和显示数据库的多种方法,包括使用mongo shell和不同编程语言驱动。同时,我们也探讨了数据库命名规则、权限管理以及不同部署架构下的操作差异。

在实际应用中,需要注意以下几点:

  1. 遵循数据库命名规则,避免因名称不符合规范导致操作失败。
  2. 在开启身份验证的环境中,确保用户具有正确的权限来执行数据库创建和显示操作。
  3. 对于不同的部署架构,了解其背后的操作机制,以便在出现问题时能够快速定位和解决。

希望通过本文的介绍,读者能够更加深入地掌握MongoDB数据库的创建和显示操作,为实际项目中的数据库管理打下坚实的基础。