2017-10-19 5 views
0

私はこの質問の場合と同じ問題があります。私の場合はモンゴ3.4にモンゴ3.2から余分なキーとインデックスの移行

MongoDB dump from 3.2, restore with 3.4, error index save = null

を、手でインデックスを再作成することはオプションではありません、私はスクリプトが必要後で私の運用環境を移行するためにこれを自動化します。私がこれまで試してみました何

1 /新しいデータベース上のmongoシェルでこれを実行している:失敗

for (var collection in ["_tempstore", "contracts", "images", "thumbs", "covers", "invoices"]) { 
    db.getCollection("cfs_gridfs." + collection + ".files").createIndex({filename: 1}); 
    db.getCollection("cfs_gridfs." + collection + ".chunks").createIndex({files_id: 1, n: 1}); 
} 

を。

2 /実行することによって、私の古いデータベース上の私のインデックス内の問題の根本である余分なwキー退治:また失敗し

db.system.indexes.update({w: {$exists: true}}, {$unset: {w: ""}}) 

を。

進める正しい方法は何ですか?

答えて

1

私はダンプされたファイルに対して実行して、それらをサニタイズするスクリプトを作成しました。

まず、これらの2つのファイルを作成します。

sanitize.sh

#!/usr/bin/env bash 

DUMP_PATH=$1 
for file in $(ls $DUMP_PATH | grep .*\.metadata\.json); do 
    node remove-extraneous-keys-from-indexes.js $DUMP_PATH/$file 
done 

remove-extraneous-keys-from-indexes.js

const fs = require("fs"); 
const {promisify} = require("util"); 

const fileName = process.argv[2]; 

(async() => { 
    const text = await promisify(fs.readFile)(fileName, 'utf8') 
    const json = JSON.parse(text) 
    json.indexes = json.indexes.map(index => ({ 
    v: index.v, 
    key: index.key, 
    name: index.name, 
    ns: index.ns 
    })) 
    await promisify(fs.writeFile)(fileName, JSON.stringify(json)) 
})() 

はその後、wはその後

$ chmod u+x sanitize.sh 
$ ./sanitize.sh path/to/dump/folder 

を実行します私はmongorestoreを実行して、すべては問題ありません。

警告:このスクリプトでは、ノードの最新バージョンが実行されていることを前提としています。これを確認するにはnode -vを実行してください。 8.6以上である必要があります。