如何使用mongoimport仅导入JSON文件中的新增数据?
嘿,这个增量导入的需求很常见,我给你梳理两个实用的方案,你可以根据自己的场景选择:
方案1:利用唯一索引 + mongoimport内置参数(最省心)
这个方法不需要额外处理文件,直接靠MongoDB的唯一索引和mongoimport的参数就能实现,前提是你的文档里有一个唯一标识字段(比如默认的_id,或者业务上的唯一键比如order_id)。
步骤:
- 先给目标集合创建唯一索引(如果用
_id的话,MongoDB默认已经自带了,这步可以跳过):
比如你的唯一键是business_id,打开mongosh执行:mongosh your_db_name --eval "db.your_collection.createIndex({business_id: 1}, {unique: true})" - 执行增量导入命令:
- 如果用默认的
_id作为唯一判断依据:mongoimport --db your_db_name --collection your_collection --file a.json --upsert - 如果用自定义的唯一键(比如
business_id):mongoimport --db your_db_name --collection your_collection --file a.json --upsert --upsertFields business_id
- 如果用默认的
原理:
--upsert参数会让mongoimport检查每个文档的唯一键:如果数据库里已经存在这个键的文档,就跳过(或者更新,不过如果新旧文档内容一致,更新等于没变化;如果内容有差异,你可以根据需求决定是否接受更新)。如果是完全新的文档,就直接插入。
如果你只想插入新增文档,绝对不更新已有文档,可以加上--mode insert,但要注意:这种模式下遇到重复键会直接报错中断导入。所以更稳妥的还是用--upsert,毕竟如果重复文档内容没变化,更新操作不会有影响。
方案2:先生成增量文件再导入(更可控)
如果你的文档没有合适的唯一键,或者你想提前确认新增数据的内容,可以先对比新旧文件生成纯增量的JSON文件,再导入。
步骤:
- 先把昨天的旧文件备份好(比如命名为
a_old.json),今天的新文件是a.json。 - 用
jq(一款命令行JSON处理工具)提取新增文档:
假设你的唯一键是_id,执行以下命令:
把# 提取旧文件里的所有唯一键,保存到临时文件 jq -r '._id' a_old.json > old_keys.txt # 从新文件中筛选出不在旧键列表里的文档,保存为增量文件 jq --argfile keys old_keys.txt 'select([._id] | inside($keys[])) | not' a.json > a_increment.json._id替换成你实际的唯一字段即可。 - 最后导入增量文件:
mongoimport --db your_db_name --collection your_collection --file a_increment.json
额外注意事项:
- 如果你的JSON文件是数组格式(比如整个文件是一个大数组包着所有文档),记得加上
--jsonArray参数,比如mongoimport --jsonArray --file ...。 - 3GB的文件不算小,导入时可以加上
--batchSize 2000(调整数值按需)来提升批量插入的效率。 - 导入前建议备份一下数据库,避免意外情况。
内容的提问来源于stack exchange,提问作者mings
相关产品推荐
相关产品推荐

