前言
最近用到了 MongoDB 的 export 来导出数据,故来此处总结下,以便日后查看。
准备数据
use studentManagement;
db.student.insert({
id: NumberInt(1),
name: "小明",
sex: "男",
scores: [
{
course: '数学',
score: NumberInt(80),
exam_date: ISODate("20210205")
},
{
course: '语文',
score: NumberInt(100),
exam_date: ISODate("20210205")
}]
});
db.student.insert({
id: NumberInt(2),
name: "小红",
sex: "女",
scores: [
{
course: '数学',
score: NumberInt(90),
exam_date: ISODate("20210205")
},
{
course: '语文',
score: NumberInt(100),
exam_date: ISODate("20210205")
}]
});
MongoExport
参数
- -h,--host :代表远程连接的数据库地址,默认连接本地Mongo数据库;
- --port:代表远程连接的数据库的端口,默认连接的远程端口27017;
- -u,--username:代表连接远程数据库的账号,如果设置数据库的认证,需要指定用户账号;
- -p,--password:代表连接数据库的账号对应的密码;
- -d,--db:代表连接的数据库;
- -c,--collection:代表连接数据库中的集合;
- -f, --fields:代表集合中的字段,可以根据设置选择导出的字段;
- --type:代表导出输出的文件类型,包括csv和json文件;
- -o, --out:代表导出的文件名;
- -q, --query:代表查询条件;
- --skip:跳过指定数量的数据;
- --limit:读取指定数量的数据记录;
- --sort:对数据进行排序,可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而-1是用于降序排列,如sort({KEY:1})。
从参数 type 可以看出主要用两种导出文件格式: JSON 和 CSV。
JSON 文件格式
mongoexport -d studentManagement -c student -o student.json --authenticationDatabase admin -u 用户名 -p 密码
执行后,数据展示
可以看到 student.json 中有两条标准的JSON格式的数据。
CSV 文件格式
mongoexport -d studentManagement -c student -o student.csv --authenticationDatabase admin -u 用户名 -p 密码 --type=csv -f id,name,sex,scores
注:除了添加 --type=csv 外,必须添加 -f 所需属性列表 ,否则会如下报错
执行后,数据展示
可以看到第一行为属性名列表,然后是两行数据。
因这里的数据 scores 是数组类型的,导出后是个字符串。这样的字符串数据是不符合所需的CSV格式的,也不利于后续的数据分析的,是我们不希望看到的数据。
故此处只是单纯地使用 export 是不合适的,所以我们需要在导出之前对数据进行处理,具体操作步骤如下:
导出为 CSV 前,先将数组数据进行拆分,保存至 student_export
db.student.aggregate([
// 拆分 scores
{$unwind: "$scores"},
// 所需属性
{$project: {id:"$id", name:"$name", sex:"$sex", course:"$scores.course", score: "$scores.score", exam_date:"$scores.exam_date", _id: 0}},
// 保存至 student_export
{$out: "student_export"},
]);
执行后,查看数据:
此时,两条数据拆分为了四条数据。
将 student_export 导出为 CSV 文件
mongoexport -d studentManagement -c student_export -o student.csv --authenticationDatabase admin -u 用户名 -p 密码 --type=csv -f id,name,sex,course,score,exam_date
执行后,数据展示
此时,就符合我们平时分析数据所用的CSV文件格式的要求了。
最后,记得删除 student_export
db.student_export.drop()