2017-10-19 2 views
0

J'ai le même problème que dans cette question:Migration des index avec des clés supplémentaires de Mongo 3.2 à mongo 3.4

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

Dans mon cas, recréer des index à la main ne sont pas une option, je besoin d'un script Cela automatise cela pour la migration de mon environnement de production plus tard.

Ce que j'ai essayé jusqu'à présent:

1/exécution de ce shell dans mongo sur la nouvelle base de données:

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}); 
} 

qui échoue.

2/Se débarrasser de la clé w étrangère qui est la racine de la question dans mes index sur mon ancienne base de données en exécutant:

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

qui échoue également.

Quelle est la bonne façon de procéder?

Répondre

1

J'ai écrit un script que je cours contre mes fichiers pour les désinfecter.

d'abord créer ces deux fichiers:

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)) 
})() 

puis exécutez

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

Alors w quand je cours mongorestore, tout va bien. AVERTISSEMENT: ce script suppose que la dernière version du noeud est en cours d'exécution. Vérifiez cela en exécutant node -v. Il devrait être 8.6 ou plus.