代码之家  ›  专栏  ›  技术社区  ›  Stephen

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

  •  2
  • Stephen  · 技术社区  · 7 年前

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

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

    1 回复  |  直到 7 年前
        1
  •  7
  •   Stephen    7 年前

    从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步:切换到新数据库并执行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"
            }
        ]
    }
    )