2013-09-27 52 views
4

我想在兩個環境之間複製mongo索引。檢查了API,發現沒有直接的方法。所以我開始編寫一個連接到一個數據庫的腳本,迭代集合,獲取索引,改變它們(因爲getIndexes()ensureIndex())具有不同的格式),連接到另一個數據庫,擦除索引並複製新索引。複製數據庫之間的MongoDb索引

這一切都讓人感覺有點凌亂,所以我認爲我必須缺少一些東西。

任何建議/良好做法?除了創建索引創建策略。

乾杯!

+0

似乎是合理的一次性的,你可能會在你未來的索引創建策略。 :) – WiredPrairie

回答

4

請您要複製索引的數據庫上運行它。

db.getCollectionNames().forEach(function(collection) { 
indexes = db[collection].getIndexes(); 
indexes.forEach(function (c) { 
opt = '' 
ixkey = JSON.stringify(c.key, null, 1).replace(/(\r\n|\n|\r)/gm,"") 
ns = c.ns.substr(c.ns.indexOf(".") + 1, c.ns.length) 
for (var key in c) { 
if (key != 'key' && key != 'ns' && key != 'v') { 
if (opt != '') { opt+= ','}   
if (c.hasOwnProperty(key)) { 
    if (typeof(c[key]) == "string") { 
     opt += (key + ': "' + c[key] + '"') 
     } else { 
     opt+= (key + ": " + c[key]) 
     } 
    } 
    } 
    } 
    if (opt != '') { opt = '{' + opt + '}'} 
    print ('db.' + ns + '.ensureIndex(' + ixkey + ','+ opt + ')') 
})}); 
1

嘗試使用這個腳本:

var i, c, 
    co_name, co_new, 
    co_old, co_old_i, 
    _db = db.getSiblingDB('logs'), 
    _colls = ['activity.games', 'activity.session', 'activity.social', 'activity.store']; 

for (i in _colls){ 
    co_name = _colls[i]; 
    co_old = _db[co_name]; 
    co_old_i = co_old.getIndexes(); 
    if(co_old.count() > 0){ 
     co_old.renameCollection(co_name + '.old'); 
     _db.createCollection(co_name); 
     co_new = _db[co_name]; 
     for(c in co_old_i){ 
      co_new.ensureIndex(co_old_i[c].key); 
     } 
    } 
} 

https://gist.github.com/alejandrobernardis/8261327

問候, 一個

+0

爲什麼不把代碼粘貼在答案中,其足夠短? – wgcrouch

2

我已經更新的Adamo Tonete的腳本

db.getCollectionNames().forEach(function(col) { 
     var indexes = db[col].getIndexes(); 
     indexes.forEach(function (c) { 
      var fields = '', result = '', options = {}; 
      for (var i in c) { 
       if (i == 'key') { 
        fields = c[i]; 
       } else if (i == 'name' && c[i] == '_id_') { 
        return; 
       } else if (i != 'name' && i != 'v' && i != 'ns') { 
        options[i] = c[i]; 
       } 
      } 
      var fields = JSON.stringify(fields).replace(/{"floatApprox":-1,"top":-1,"bottom":-1}/ig, '-1').replace(/{"floatApprox":(\d+)}/ig, '$1'); 
      var options = JSON.stringify(options).replace(/{"floatApprox":-1,"top":-1,"bottom":-1}/ig, '-1').replace(/{"floatApprox":(\d+)}/ig, '$1'); 
      if (options == '{}') { 
       result = "db." + col + ".createIndex(" + fields + "); "; 
      } else { 
       result = "db." + col + ".createIndex(" + fields + ", " + options + "); "; 
      } 
      print(result); 
     }); 
    });