使用mongodump导出视图时,如何一并导出底层集合的索引定义?
解决MongoDB视图导出时同时包含底层集合索引的问题
以下是几种可行的方案,能帮你在导出视图数据的同时,一并处理底层集合的索引:
方案1:分开导出视图数据与集合元数据(含索引),合并恢复
- 导出视图数据:
mongodump --db 你的数据库名 --collection 你的视图名 --out 导出目录 - 导出底层集合的元数据(仅结构和索引,不含数据):
这个空查询会让mongodump只导出集合的结构定义和索引信息,不会导出任何文档。mongodump --db 你的数据库名 --collection 底层集合名 --out 导出目录 --query '{"_id": {"$exists": false}}' - 恢复步骤:
- 先恢复底层集合的元数据,创建带索引的空集合:
mongorestore --db 目标数据库名 --collection 目标集合名 导出目录/你的数据库名/底层集合名.metadata.json - 再将视图的数据导入到这个空集合:
mongorestore --db 目标数据库名 --collection 目标集合名 导出目录/你的数据库名/你的视图名.bson
- 先恢复底层集合的元数据,创建带索引的空集合:
方案2:导出全库后筛选所需文件
- 先导出整个数据库:
mongodump --db 你的数据库名 --out 全量导出目录 - 进入导出目录的数据库子目录,删除除了
你的视图名.bson和底层集合名.metadata.json之外的所有文件。 - (可选)如果目标集合名和原底层集合名不同,修改
底层集合名.metadata.json里的name字段为目标集合名。 - 执行恢复:
恢复时mongorestore会自动读取同目录下的metadata.json文件,为目标集合创建索引。mongorestore --db 目标数据库名 --collection 目标集合名 全量导出目录/你的数据库名/你的视图名.bson
方案3:脚本导出索引定义,恢复后自动创建
- 用Mongo Shell导出底层集合的索引定义,保存为脚本文件:
将输出保存为// 运行在源数据库的Mongo Shell中 const indexes = db.底层集合名.getIndexes(); // 可添加过滤逻辑剔除不需要的索引(比如基于未导出字段的索引) // const filteredIndexes = indexes.filter(idx => !idx.key.hasOwnProperty('不需要的字段名')); printjson(indexes);indexes.js,并修改其中的集合名为目标集合名。 - 恢复视图数据后,在目标数据库运行脚本创建索引:
mongo 目标数据库名 indexes.js
关于视图未包含字段的索引说明
即使索引基于视图未导出的字段,依然可以正常创建:MongoDB允许在不存在字段的集合上创建索引,后续如果有数据写入这些字段,索引会自动维护。如果不需要这类索引,可在导出索引定义时通过过滤逻辑剔除。
内容的提问来源于stack exchange,提问作者Raketenolli
相关产品推荐
相关产品推荐

