MongoDB 将所有现有索引迁移到新数据库

2024-04-24

我有一个 MongoDB 开发集群,随着时间的推移,我在其中创建索引,作为开发改进的一部分。在测试/生产 MongoDB 集群上,我也想维护相同的索引。

那么我如何获取现有集合的所有索引并在新数据库上创建相同的集合索引?


从 mongo shell 切换到要收集索引的数据库

第 1 步:切换到现有数据库并运行以下脚本

> use my_existing_db

下面的脚本循环遍历所有集合并构造一个run command对于每个集合。

var database = ‘my_new_db' // SHOULD ALWAYS MATCH DESTINATION DB NAME
db.getCollectionNames().forEach(function(collection){    
    var command = {}
    var indexes = []    
    idxs = db.getCollection(collection).getIndexes()        
    if(idxs.length>1){
        idxs.forEach(function(idoc){
            if(idoc.name!='_id_'){
                var ns = database+"."+idoc.ns.substr(idoc.ns.indexOf('.') + 1 )
                idoc.ns = ns
                indexes.push(idoc)
            }
        })        
        command['createIndexes'] = collection
        command['indexes'] = indexes         
        print('db.runCommand(')
        printjson(command)     
        print(')')
    }
})

脚本输出每个集合的 runCommand

步骤2:切换到新的db并执行runCommands。完成,干杯!

> use my_new_db

runCommands 会是这样的。您可以一次性运行所有命令。

db.runCommand(
{
    "createIndexes" : "foo",
    "indexes" : [
        {
            "v" : 2,
            "key" : {
                "xy_point" : "2d"
            },
            "name" : "xy_point_2d",
            "ns" : "my_new_db.foo",
            "min" : -99999,
            "max" : 99999
        },
        {
            "v" : 2,
            "key" : {
                "last_seen" : 1
            },
            "name" : "last_seen_1",
            "ns" : "my_new_db.foo",
            "expireAfterSeconds" : 86400
        },
        {
            "v" : 2,
            "key" : {
                "point" : "2dsphere"
            },
            "name" : "point_2dsphere",
            "ns" : "my_new_db.foo",
            "background" : false,
            "2dsphereIndexVersion" : 3
        }
    ]
}
)
db.runCommand(
{
    "createIndexes" : "bar",
    "indexes" : [
        {
            "v" : 2,
            "unique" : true,
            "key" : {
                "date" : 1,
                "name" : 1,
                "age" : 1,
                "gender" : 1
            },
            "name" : "date_1_name_1_age_1_gender_1",
            "ns" : "my_new_db.bar"
        }
    ]
}
)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MongoDB 将所有现有索引迁移到新数据库 的相关文章

随机推荐