介绍
在本实验中,你将学习将数据导入 MongoDB 数据库所需的核心技能。你将使用两种常见的数据格式:JSON 和 CSV。你将使用 mongoimport 命令行工具将数据从文件加载到 MongoDB 集合中。本实验将指导你完成数据导入、在导入过程中指定数据类型,以及使用查询和 mongoexport 工具验证数据是否已正确加载。
从 JSON 文件导入数据
在第一步中,你将从一个 JSON 文件导入数据到 MongoDB 集合中。JSON (JavaScript Object Notation) 是 MongoDB 的原生格式,这使得导入过程非常直接。我们将使用 mongoimport 工具,这是一个为此目的设计的命令行工具。
一个名为 books.json 的示例文件已为你创建在 ~/project 目录下。首先,请在你的终端中查看其内容。
cat ~/project/books.json
你应该会看到以下输出,这是一个 JSON 文档数组:
[
{
"_id": 1,
"title": "MongoDB Basics",
"author": "Jane Smith",
"year": 2023,
"tags": ["mongodb", "database", "nosql"]
},
{
"_id": 2,
"title": "Python Programming",
"author": "John Doe",
"year": 2022,
"tags": ["python", "programming"]
},
{
"_id": 3,
"title": "Data Science Handbook",
"author": "Alice Johnson",
"year": 2021,
"tags": ["data science", "python", "machine learning"]
}
]
现在,将这些数据导入到一个名为 library_db 的新数据库和一个名为 books 的集合中。
mongoimport --db library_db --collection books --file ~/project/books.json --jsonArray
让我们分解一下命令选项:
--db library_db: 指定目标数据库。--collection books: 指定数据库内的目标集合。--file ~/project/books.json: 提供输入文件的路径。--jsonArray: 告知mongoimport文件包含一个单一的 JSON 数组,数组中的每个元素都是一个要插入的文档。
你将看到显示导入进度和完成情况的输出:
2025-08-27T15:10:40.411+0800 connected to: mongodb://localhost/
2025-08-27T15:10:40.417+0800 3 document(s) imported successfully. 0 document(s) failed to import.
为了验证数据是否已正确导入,你现在将使用 MongoDB Shell (mongosh) 连接到 MongoDB。
mongosh
进入 shell 后,切换到 library_db 数据库:
use library_db
现在,统计 books 集合中的文档数量,以确认所有三个记录都已导入。
db.books.countDocuments()
输出应为 3。你还可以查看一个导入的文档以检查其结构。
db.books.findOne()
这将显示集合中的第一个文档。最后,退出 MongoDB Shell 以返回到你的终端。
exit
从 CSV 文件导入数据
接下来,你将从一个 CSV (Comma-Separated Values) 文件导入数据。CSV 是一种常见的表格数据格式,mongoimport 可以轻松地将其转换为 MongoDB 文档。
一个名为 library_members.csv 的示例 CSV 文件已为你准备好。请查看其内容。
cat ~/project/library_members.csv
该文件包含一个标题行和三行数据:
name,age,membership_status
John Doe,35,active
Jane Smith,28,active
Mike Johnson,42,expired
现在,使用 mongoimport 将这些数据加载到同一个 library_db 数据库中的一个名为 members 的新集合里。
mongoimport --db library_db --collection members --type csv --file ~/project/library_members.csv --headerline
以下是用于 CSV 导入的新选项:
--type csv: 指定输入文件格式为 CSV。--headerline: 告知mongoimport使用文件第一行作为文档的字段名。
输出将确认导入成功:
2025-08-27T15:11:33.553+0800 connected to: mongodb://localhost/
2025-08-27T15:11:33.558+0800 3 document(s) imported successfully. 0 document(s) failed to import.
让我们来验证一下导入。连接到 MongoDB Shell 并检查 members 集合。你可以在启动 mongosh 时直接指定数据库,以节省一个步骤。
mongosh library_db
现在,统计 members 集合中的文档数量。
db.members.countDocuments()
结果应为 3。接下来,检查一个文档,看看 mongoimport 是如何将 CSV 行转换为 BSON 文档的。
db.members.findOne()
你将看到一个类似这样的文档。请注意,默认情况下,包括 age 在内的所有值都将作为字符串导入。
{
_id: ObjectId("..."),
name: 'John Doe',
age: '35',
membership_status: 'active'
}
你将在下一步学习如何处理数据类型。现在,退出 shell。
exit
CSV 导入时处理数据类型
从 CSV 文件导入时,mongoimport 默认将所有值都视为字符串。如果你需要执行数值或基于日期的操作,这可能会成为一个问题。在这一步中,你将学习如何导入 CSV 数据,然后在 MongoDB 中转换数据类型。
让我们将 library_members.csv 数据重新导入到一个名为 typed_members 的新集合中,然后转换 age 字段为整数。
首先,创建一个没有标题行的 CSV 文件,因为我们将显式定义字段名:
tail -n +2 ~/project/library_members.csv > ~/project/library_members_no_header.csv
现在,使用显式字段名导入数据:
mongoimport --db library_db --collection typed_members --type csv --file ~/project/library_members_no_header.csv --fields "name,age,membership_status"
导入后,我们需要使用 MongoDB 的更新操作将 age 字段从字符串转换为整数:
mongosh library_db --eval "db.typed_members.updateMany({}, [{ \$set: { age: { \$toInt: \"\$age\" } } }])"
此命令在更新操作中使用 MongoDB 的聚合管道,通过 $toInt 操作符将所有 age 值从字符串转换为整数。
现在让我们通过连接到 mongosh 并检查 typed_members 集合中的数据类型来验证结果。
mongosh library_db
首先,在集合中查找一个文档以查看转换后的数据:
db.typed_members.findOne()
输出应显示 age 字段为数字:
{
_id: ObjectId("..."),
name: 'Jane Smith',
age: 28,
membership_status: 'active'
}
你可以在 mongosh 中使用 JavaScript 的 typeof 操作符来显式检查 age 字段的类型:
typeof db.typed_members.findOne().age
输出应为 number,确认数据类型转换成功。这允许你执行数值查询,例如查找所有年龄大于 30 的成员:
db.typed_members.find({ age: { $gt: 30 } })
此查询现在将按预期工作,并返回两个文档。退出 shell 以继续下一步:
exit
通过查询和导出验证数据
任何数据导入过程的最后一步都是彻底的验证。这不仅包括检查文档数量,还包括运行查询来抽样数据并确保其完整性。你还可以将数据导出到外部文件以进行进一步分析。
首先,使用 mongosh 连接到你的数据库。
mongosh library_db
你可以列出数据库中的所有集合,以查看你到目前为止的工作成果。
show collections
你应该会看到 books、members 和 typed_members。现在,让我们运行一些查询来验证数据。对于 books 集合,查找所有带有 "python" 标签的书籍。
db.books.find({ tags: "python" })
此查询演示了如何在数组字段中进行搜索。你应该会看到返回两本书。对于 typed_members 集合,查找所有会员状态为 "active" 的成员。
db.typed_members.find({ membership_status: "active" })
这应该会返回两个成员。这些简单的查询有助于确认数据结构符合预期。
另一个强大的验证工具是 mongoexport,它执行与 mongoimport 相反的操作。它将一个集合导出到一个文件。让我们将 books 集合导出到一个新的 JSON 文件。首先退出 shell。
exit
现在,从你的终端运行 mongoexport 命令。
mongoexport --db library_db --collection books --out ~/project/exported_books.json
--out 标志指定输出文件的路径。此命令将在你的项目目录中创建一个名为 exported_books.json 的文件。你可以查看其内容来验证导出。
cat ~/project/exported_books.json
输出文件中的每一行都是你集合中的一个独立的 JSON 文档。此文件可用于备份、迁移或与其他工具进行分析。
总结
在此次实验中,你学习了如何使用 mongoimport 工具将数据从 JSON 和 CSV 文件导入 MongoDB。你练习了将 JSON 数组导入集合,并通过 mongosh 验证了结果。然后,你从 CSV 文件导入数据,首先使用默认的字符串类型,然后为数字等字段指定数据类型。最后,你学习了如何通过在 mongosh 中运行查询以及使用 mongoexport 将集合导出回文件来验证导入数据的完整性。这些是管理任何 MongoDB 项目中数据的基本技能。

