Миграция индексов с дополнительными ключами от Mongo 3.2 до Mongo 3.4

У меня та же проблема, что и в этом вопросе:

MongoDB дамп из 3.2, восстановление с 3.4, индекс ошибки save = null

В моем случае воссоздание индексов вручную не является опцией, мне нужен script, который автоматизирует это для последующей миграции моей рабочей среды.

То, что я пробовал до сих пор:

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

Я написал script, что я запускаю свои файлы, чтобы их дезинфицировать.

Сначала создайте эти два файла:

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

затем запустите

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

Затем, когда я запускаю mongorestore, все в порядке.

ПРЕДУПРЕЖДЕНИЕ: этот script предполагает, что у вас установлена ​​последняя версия node. Проверьте это, запустив node -v. Это должно быть 8.6 или больше.