文章目录


前言

一、MongoDB版本选择

二、常用命令

1.空字段定义不同,统一为null

2.字符串拼接

3.去重,合并

总结



前言

课程项目,主要任务是对从三个学术网站爬到的文献信息进行数据清洗并合并


一、MongoDB版本选择

起初下载的最新版6.0,但在配置时就出现错误,参考评论区发现是版本固有错误,遂卸载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字段为空的数值所以放弃。

更新字段进行拼接,改为如下代码

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.


总结

没啥要总结的