0
私は開発の改善の一環としてインデックスを作成するMongoDB開発クラスタを持っています。テスト/生産MongoDBクラスタでも、私は同じインデックスを維持したい。MongoDB既存のすべてのインデックスを新しいデータベースに移行する
既存のコレクションのインデックスをすべて取得し、同じコレクションインデックスを新しいデータベースに作成するにはどうすればよいですか?モンゴシェルから
私は開発の改善の一環としてインデックスを作成するMongoDB開発クラスタを持っています。テスト/生産MongoDBクラスタでも、私は同じインデックスを維持したい。MongoDB既存のすべてのインデックスを新しいデータベースに移行する
既存のコレクションのインデックスをすべて取得し、同じコレクションインデックスを新しいデータベースに作成するにはどうすればよいですか?モンゴシェルから
、あなたがインデックスに
ステップ1を収集したい場所からデータベースに切り替える:スクリプトスクリプト以下
> use my_existing_db
以下の既存のDBと実行するようにスイッチがすべてをループコレクションごとにrun command
を収集し、構成します。新しいDBに切り替え、runCommandsを実行します。
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(')')
}
})
スクリプトは、各コレクション
ステップ2のためのrunCommand関数年代を出力します。完了、乾杯!
> 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"
}
]
}
)