介绍
在本实验中,你将学习如何使用 mongoexport 命令行工具从 MongoDB 数据库导出数据。你将练习将数据导出为两种常见格式:JSON 和 CSV。本实验将指导你创建示例数据集、导出整个集合、选择要导出的特定字段以及使用查询来过滤要导出的数据。完成本实验后,你将熟练掌握从 MongoDB 中提取数据以进行备份、分析或迁移到其他系统。
在本实验中,你将学习如何使用 mongoexport 命令行工具从 MongoDB 数据库导出数据。你将练习将数据导出为两种常见格式:JSON 和 CSV。本实验将指导你创建示例数据集、导出整个集合、选择要导出的特定字段以及使用查询来过滤要导出的数据。完成本实验后,你将熟练掌握从 MongoDB 中提取数据以进行备份、分析或迁移到其他系统。
在第一步中,你将学习将 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"}
虽然 JSON 非常适合保留数据结构,但 CSV (Comma-Separated Values) 通常更方便在电子表格中使用或进行简单的数据交换。在这一步中,你将把相同的 users 集合导出为 CSV 文件。
导出为 CSV 时,你必须指定要包含的字段。这是因为 CSV 是一种扁平的、表格化的格式,无法表示嵌套的 JSON 结构。
再次使用 mongoexport 命令,但这次添加 --type=csv 和 --fields 选项。我们将导出 name、age 和 email 字段。
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 中提取数据以满足各种需求的实用技能。