我想在兩個環境之間複製mongo索引。檢查了API,發現沒有直接的方法。所以我開始編寫一個連接到一個數據庫的腳本,迭代集合,獲取索引,改變它們(因爲getIndexes()
和ensureIndex()
)具有不同的格式),連接到另一個數據庫,擦除索引並複製新索引。複製數據庫之間的MongoDb索引
這一切都讓人感覺有點凌亂,所以我認爲我必須缺少一些東西。
任何建議/良好做法?除了創建索引創建策略。
乾杯!
我想在兩個環境之間複製mongo索引。檢查了API,發現沒有直接的方法。所以我開始編寫一個連接到一個數據庫的腳本,迭代集合,獲取索引,改變它們(因爲getIndexes()
和ensureIndex()
)具有不同的格式),連接到另一個數據庫,擦除索引並複製新索引。複製數據庫之間的MongoDb索引
這一切都讓人感覺有點凌亂,所以我認爲我必須缺少一些東西。
任何建議/良好做法?除了創建索引創建策略。
乾杯!
請您要複製索引的數據庫上運行它。
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 + ')')
})});
嘗試使用這個腳本:
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
問候, 一個
爲什麼不把代碼粘貼在答案中,其足夠短? – wgcrouch
我已經更新的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);
});
});
似乎是合理的一次性的,你可能會在你未來的索引創建策略。 :) – WiredPrairie