导出 MongoDB 数据

MongoDBBeginner
立即练习

介绍

在本实验中,你将学习如何使用 mongoexport 命令行工具从 MongoDB 数据库导出数据。你将练习将数据导出为两种常见格式:JSON 和 CSV。本实验将指导你创建示例数据集、导出整个集合、选择要导出的特定字段以及使用查询来过滤要导出的数据。完成本实验后,你将熟练掌握从 MongoDB 中提取数据以进行备份、分析或迁移到其他系统。

将集合导出为 JSON

在第一步中,你将学习将 MongoDB 集合导出为 JSON 文件的基本过程。JSON (JavaScript Object Notation) 是一种标准格式,可以保留 MongoDB 文档丰富的嵌套结构,非常适合备份和迁移。

首先,你需要连接到 MongoDB 服务器并创建一些示例数据。通过在终端中运行以下命令来打开 MongoDB Shell:

mongosh

进入 MongoDB Shell 后,你将看到一个新的提示符。现在,创建并切换到一个名为 exportlab 的新数据库,并在 users 集合中插入三个文档。

use exportlab
db.users.insertMany([
  { name: "Alice", age: 28, email: "alice@example.com", status: "active" },
  { name: "Bob", age: 35, email: "bob@example.com", status: "active" },
  { name: "Charlie", age: 42, email: "charlie@example.com", status: "inactive" }
]);

插入文档后,你将看到一条确认消息。现在,退出 MongoDB Shell 以返回到常规终端。

exit;

数据准备就绪后,你就可以使用 mongoexport 工具导出 users 集合了。此命令指定了数据库、集合和输出文件。

mongoexport --db=exportlab --collection=users --out=$HOME/project/users.json
  • --db: 指定要连接的数据库 (exportlab)。
  • --collection: 指定要导出的集合 (users)。
  • --out: 指定输出文件的路径和文件名 ($HOME/project/users.json)。

要确认导出成功,请查看新创建的 JSON 文件的内容。

cat ~/project/users.json

你将看到你插入的三个文档,每个文档都位于新的一行中,格式为 JSON。这种格式称为 JSONL (JSON Lines),其中每一行包含一个独立的、完整的 JSON 对象。请注意,MongoDB 会为每个文档添加一个唯一的 _id 字段。

{"_id":{"$oid":"656f1a6b..."},"name":"Alice","age":28,"email":"alice@example.com","status":"active"}
{"_id":{"$oid":"656f1a6b..."},"name":"Bob","age":35,"email":"bob@example.com","status":"active"}
{"_id":{"$oid":"656f1a6b..."},"name":"Charlie","age":42,"email":"charlie@example.com","status":"inactive"}

将集合导出为 CSV

虽然 JSON 非常适合保留数据结构,但 CSV (Comma-Separated Values) 通常更方便在电子表格中使用或进行简单的数据交换。在这一步中,你将把相同的 users 集合导出为 CSV 文件。

导出为 CSV 时,你必须指定要包含的字段。这是因为 CSV 是一种扁平的、表格化的格式,无法表示嵌套的 JSON 结构。

再次使用 mongoexport 命令,但这次添加 --type=csv--fields 选项。我们将导出 nameageemail 字段。

mongoexport --db=exportlab --collection=users --type=csv --fields=name,age,email --out=$HOME/project/users.csv
  • --type=csv: 此标志告诉 mongoexport 以 CSV 格式输出。
  • --fields: 一个逗号分隔的字段列表,用于包含在导出中。你在此处列出的顺序决定了 CSV 文件中的列顺序。

现在,检查 users.csv 文件的内容。

cat ~/project/users.csv

输出将是标准的 CSV 格式,字段名称作为标题行,后面是数据。

name,age,email
Alice,28,alice@example.com
Bob,35,bob@example.com
Charlie,42,charlie@example.com

你现在已成功将相同的数据导出为两种不同的格式。

使用查询过滤数据

通常,你不需要导出整个集合。mongoexport 允许你使用查询来过滤要导出的文档。这对于提取数据的特定子集非常有用。

在这一步中,你将只导出 status 为 "active" 的用户。--query 选项接受一个 JSON 文档,该文档指定了过滤条件,就像在 MongoDB Shell 中执行 find() 操作一样。

运行以下命令,将仅活动用户导出到一个名为 active_users.json 的新 JSON 文件中。

mongoexport --db=exportlab --collection=users --query='{"status": "active"}' --out=$HOME/project/active_users.json
  • --query='{"status": "active"}': 此选项过滤文档,仅导出 status 字段等于 "active" 的文档。请注意,JSON 字符串周围使用了单引号,以防止 shell 解释问题。

让我们验证一下导出文件的内容。

cat ~/project/active_users.json

输出应该只包含 Alice 和 Bob 的文档,因为 Charlie 的状态是 "inactive"。

{"_id":{"$oid":"656f1a6b..."},"name":"Alice","age":28,"email":"alice@example.com","status":"active"}
{"_id":{"$oid":"656f1a6b..."},"name":"Bob","age":35,"email":"bob@example.com","status":"active"}

这种过滤功能非常强大,可以在导出数据后无需进行任何操作即可创建有针对性的数据导出。

格式化和限制输出

mongoexport 提供了额外的选项来控制你导出的数据格式和数量。在这一步中,你将学习如何创建更易于人类阅读的“美化”JSON 输出,以及如何限制导出文档的数量。

首先,让我们再次导出 users 集合,但这次使用 --pretty 标志。这将格式化 JSON 输出,使其包含缩进和换行符,从而大大提高可读性。

mongoexport --db=exportlab --collection=users --pretty --out=$HOME/project/users_pretty.json
  • --pretty: 将输出的 JSON 格式化为人类可读的格式。

查看格式化后的文件以了解差异。

cat ~/project/users_pretty.json

输出将是漂亮地缩进的,如下所示:

[
  {
    "_id": {
      "$oid": "656f1a6b..."
    },
    "name": "Alice",
    "age": 28,
    "email": "alice@example.com",
    "status": "active"
  },
  {
    "_id": {
      "$oid": "656f1a6b..."
    },
    "name": "Bob",
    "age": 35,
    "email": "bob@example.com",
    "status": "active"
  },
  {
    "_id": {
      "$oid": "656f1a6b..."
    },
    "name": "Charlie",
    "age": 42,
    "email": "charlie@example.com",
    "status": "inactive"
  }
]

接下来,你将使用 --limit 选项来仅导出特定数量的文档。这对于创建小型样本文件或进行测试非常有用。让我们将前两个文档导出到一个 CSV 文件中。

mongoexport --db=exportlab --collection=users --type=csv --fields=name,status --limit=2 --out=$HOME/project/users_limited.csv
  • --limit=2: 将导出限制为最多 2 个文档。

检查限制后的 CSV 文件的内容。

cat ~/project/users_limited.csv

正如预期的那样,文件包含标题和前两个用户记录。

name,status
Alice,active
Bob,active

验证导出的文件

在最后一步中,你将练习使用常见的 Linux 命令行工具来检查和验证你创建的文件。这是确认数据导出完整性的关键技能。

首先,列出项目目录中的所有文件,以查看你创建的所有内容。-lh 标志将以人类可读的格式显示详细信息。

ls -lh ~/project/

你应该会看到前几个步骤中创建的所有 .json.csv 文件。

total 20K
-rw-rw-r-- 1 labex labex 224 Aug 27 15:48  active_users.json
-rw-rw-r-- 1 labex labex  96 Aug 27 15:48  users.csv
-rw-rw-r-- 1 labex labex 344 Aug 27 15:36  users.json
-rw-rw-r-- 1 labex labex  36 Aug 27 15:48  users_limited.csv
-rw-rw-r-- 1 labex labex 410 Aug 27 15:48  users_pretty.json

接下来,使用 wc -l 命令计算文件中的行数。这是检查导出文档数量的快速方法。

wc -l ~/project/*.json ~/project/*.csv

对于每行一个文档的 JSON 文件,行数等于文档数。对于 CSV 文件,行数是数据行数加上标题行数。

  2 /home/labex/project/active_users.json
  3 /home/labex/project/users.json
27 /home/labex/project/users_pretty.json
  4 /home/labex/project/users.csv
  3 /home/labex/project/users_limited.csv
39 total

最后,你可以验证 JSON 文件的语法。请注意,mongoexport 默认创建 JSONL (JSON Lines) 格式,其中每个文档都是一个独立的 JSON 对象,占一行。要验证此格式,你可以逐行检查:

while IFS= read -r line; do
  echo "$line" | python3 -m json.tool > /dev/null
done < ~/project/users.json && echo "All JSON lines are valid"

如果命令运行没有错误,则表示你的 JSON 文件是有效的。这些验证技术有助于确保你的数据导出完整且正确。

总结

在本实验中,你学习了 mongoexport 工具的基本功能。你首先创建了一个示例数据集,并执行了基本的 JSON 文件导出。然后,你将相同的数据导出为 CSV 文件,学习了如何使用 --fields 为表格格式指定字段。你还练习了使用 --query 选项来过滤数据,并仅导出特定子集文档。最后,你探索了格式化选项,如用于人类可读 JSON 的 --pretty 和用于控制导出记录数量的 --limit。通过这些练习,你获得了从 MongoDB 中提取数据以满足各种需求的实用技能。