项目中,发现通过mongodump导出,再通过mongoresto导入数据,发现数据顺序发生变化,从而导致前台显示数据错乱(由于后台直接采用数据库的默认排序,而未按业务排序)
mongodb版本:3.4.3
问题重现:
1.导出数据
mongodump -u admin -p 123456 --authenticationDatabase admin -d coms -c docTpl --archive=/root/coms_bak_20170518.gz --gzip
![mongodb导入导出数据顺序发生变化_数据](//dev-img.mos.moduyun.com/20231024/7c9880a1-5a27-40e4-abc1-6e7fe7cbb39c.png)
2.导入数据
mongorestore -u admin -p 123456 --drop -d coms -c docTpl --authenticationDatabase admin --gzip --archive=/home/coms_bak_20170518.gz
![mongodb导入导出数据顺序发生变化_hive_02](//dev-img.mos.moduyun.com/20231024/1a3e9fb0-a173-4221-bff5-35c13a2bb1b7.png)
3.数据差异
源库数据:
![mongodb导入导出数据顺序发生变化_hive_03](//dev-img.mos.moduyun.com/20231024/717aa3a8-a6f0-400f-9d19-9ba4bb5797ce.png)
目标库数据,此时数据顺序已经发生变化
![mongodb导入导出数据顺序发生变化_hive_04](//dev-img.mos.moduyun.com/20231024/0c1468e7-3419-4c33-af5e-f05bb05caaf9.png)
问题解决:
此时查看mongodump的帮助发现numParallelCollections选项
--numParallelCollections number of collections to dump in parallel (4 by default) (default: 4) 支持多个集合并发导出/导入默认是4
此处并没有说明单个集合也是采用并发导出导入,是不是与这个参数有关,尝试将--numParallelCollections=1
1.导出数据
mongodump -u admin -p 123456 --authenticationDatabase admin --numParallelCollections=1 -d coms -c docTpl --archive=/root/coms_bak_20170524.gz --gzip
![mongodb导入导出数据顺序发生变化_hive_05](//dev-img.mos.moduyun.com/20231024/c3bdfa22-a902-4d68-8364-d5ce306c9be6.png)
2.导入数据
mongorestore -u admin -p 123456 --drop -d coms -c docTpl --authenticationDatabase admin --numParallelCollections=1 --gzip --archive=/home/coms_bak_20170524.gz
![mongodb导入导出数据顺序发生变化_hive_06](//dev-img.mos.moduyun.com/20231024/f44f32f3-e6e5-4d52-a821-5f93e599aba2.png)
3.比较数据的顺序是否一样
源库数据:
![mongodb导入导出数据顺序发生变化_数据_07](//dev-img.mos.moduyun.com/20231024/ff19e00b-259d-41e9-a2e3-ee1294b03a77.png)
目标库数据:
![mongodb导入导出数据顺序发生变化_hive_08](//dev-img.mos.moduyun.com/20231024/efcf2dab-437f-4623-8e80-0279a8ad1354.png)
通过比较发现此时两边的数据顺序是完全一致的,所有由此可以得出numParallelCollections参数单个集合也是采用并发方式导出的。