前言
课程项目,主要任务是对从三个学术网站爬到的文献信息进行数据清洗并合并
一、MongoDB版本选择
起初下载的最新版6.0,但在配置时就出现错误,参考https://blog.csdn.net/lucky_ferry/article/details/121767417评论区发现是版本固有错误,遂卸载6.0安装了4.0
后续合并数据集合时发现merge函数是4.2版本的功能,且4.4支持合并到现有集合中,又重新安装了4.4版本,虽然最后也没用上merge。。。。
二、常用命令
1.空字段定义不同,统一为null
db.collection.updateMany({field:""},{$set:{"field":null}});
db.collection.updateMany({field:"null"},{$set:{"field":null}});
2.字符串拼接
文献doi格式需统一为
https://doi.org/10.1109/RFIC.2020.0000020
有的数据的doi只包括后边的数字字符串,需拼接上http前缀。一开始设想直接导出为json,将"doi:"替换为"doi: http://doi.org/",但由于存在doi字段为空的数值所以放弃。
参考mongodb update拼接多字段_jjwen的博客-CSDN博客_mongodb 更新字段进行拼接,改为如下代码
db.collection.find({"doi": {$ne:null} }).forEach(function(item){
db.collention.update(
{"_id":item._id},
{ $set : { "doi" : "http://doi.org" + item.doi}}
)
})
由于逐行过的(怀疑是forEach的问题)且数据有仅30w条,这个代码跑了有两个多小时,而且没有进度条,我只好用不断根据json文件里的title查询doi,根据文档的滚动条判断进度。也就是这个过程中发现可能存在很多重复数据。
3.去重,合并
一开始想用merge,但MongoDB $merge 教學 (如同 SQL 的 SELECT INTO! ) | Pie Note发现必须保证数据本身就无重复重复项,参考将MongoDB重复数据删除的几种方法 - 掘金,使用group聚合再删除不断报错,遂选择先导出-建立索引-导入。代码如下
//将数据导出为JSON格式存档:
mongoexport -d database_name -c collection_name -o filename.json
//清空当前集合的数据:
db.yourcollection.remove({})
//新建唯一索引:
db.yourcollection.createIndex({public_no:1}, {unique:true})
//导入之前存档的JSON文件数据:
mongoimport -d database_name -c collection_name --upsert filename.json
//用到的几个参数选项说明:-d 数据库名 -c 集合名 -o 导出后的目录及文件名 --upsert 会根据唯一索引去掉重复记录
最后导入那步还是报错,用MongoDB Compass自带导入功能成功,原因是没有安装MongoDB Developer Tools.
总结
没啥要总结的