如何在损坏后在MongoDB中进行批量更新

时间:2018-05-14 04:19:25

标签: mongodb

我将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中的标题?我注意到checklistID保持不变但卡ID不同 - 我当然可以将旧的wekan.checklists集合加载到我当前(已升级)的数据库中进行查询。

1 个答案:

答案 0 :(得分:0)

修复:将旧的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