Как массовое обновление в MongoDB после коррупции - PullRequest
0 голосов
/ 14 мая 2018

Я обновил Wekan с 0,48 до 0,95. Похоже, что в Mongo произошло то, что он взял коллекцию контрольных списков из коллекции, содержащей вложенный список элементов, и разделил ее на новую коллекцию checklistItems. Похоже, что они правильно скопировали данные, за исключением того, что вместо копирования заголовка каждого элемента он копировал заголовок контрольного списка в каждый список.

Я начал с этого в wekan.checklists:

{
  "_id": "z329QEDfjsuQcxz7E",
  "cardId": "TBgz6gMGCcn9XNPSW",
  "title": "A list",
  "sort": 0,
  "createdAt": {
    "$date": "2018-05-09T22:20:50.537Z"
  },
  "items": [
    {
      "_id": "z329QEDfjsuQcxz7E0",
      "title": "Do some stuff",
      "isFinished": false,
      "sort": 0
    },
    {
      "_id": "z329QEDfjsuQcxz7E1",
      "title": "Do some other stuff",
      "isFinished": false,
      "sort": 1
    }
  ],
  "userId": "YndMrPQ5XhZTTKD2S"
}

и в wekan.checklistItems имеем следующее:

{
  "_id": "RADPEu4nhr9PgwPHH",
  "title": "A list",
  "sort": 0,
  "isFinished": false,
  "checklistId": "z329QEDfjsuQcxz7E",
  "cardId": "TBgz6gMGCcn9XNPSW"
}
{
  "_id": "Guy3aaJL4WLJQjzRX",
  "title": "A list",
  "sort": 1,
  "isFinished": false,
  "checklistId": "z329QEDfjsuQcxz7E",
  "cardId": "TBgz6gMGCcn9XNPSW"
}

и это в wekan.checklists:

{ "_id" : "z329QEDfjsuQcxz7E", "cardId" : "TBgz6gMGCcn9XNPSW", "title" : "MVP", "sort" : 0, "createdAt" : ISODate("2018-05-09T22:20:50.537Z"), "userId" : "YndMrPQ5XhZTTKD2S" }

Есть ли быстрый запрос, чтобы вернуться к моим исходным wekan.checklists и обновить заголовки в wekan.checklistItems? Я отмечаю, что идентификаторы checklist остались прежними, но идентификаторы карт отличаются - я, конечно, могу загрузить старую коллекцию wekan.checklists в мою текущую (обновленную) базу данных для запроса.

1 Ответ

0 голосов
/ 14 мая 2018

Исправлено: загрузите ваши старые db.checklists в db.checklistsOld (я использовал mongoimport -d wekan -c checklistsOld ~/checklistsOld.bson, где checklistsOld.bson хранил мою резервную копию до обновления. Используйте следующий скрипт в Robo3T:

db.checklistsOld.find({}, {"_id": 1, "items.title":1, "items.sort": 1 }).forEach( (list, i, lists) => { 
  var checklistId = list._id;
  list.items.forEach( (item, j, items) => {
      var sort = item.sort,
          title = item.title;
      db.checklistItems.update({"checklistId": checklistId, "sort":sort}, {$set: {"title": title}} );
  });
});

В зависимости от того, сколько предметов у вас есть, вам может понадобиться настроить «shellTimeoutSec» в Robo3T (https://github.com/Studio3T/robomongo/wiki/Robomongo-Config-File-Guide)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...