2013-05-17 187 views
9

我正在更改我的一个MongoDB集合的模式。 (我一直在将日期存储为字符串,现在我的应用程序将它们存储为ISODate;我需要返回并更改所有旧记录以使用ISODate s)。我想我知道如何使用更新,但由于这个操作会影响成千上万的记录,所以我不愿意发出一个我不能100%确定的操作。有什么办法可以做一个更新的“空运行”,它会告诉我,对于少量的记录,原始记录以及它将如何改变?有没有办法执行更新操作的“空运行”?


编辑:我结束了使用添加一个新的领域,以每个记录,然后的方式重命名该字段原来的匹配(验证数据是正确的之后)。它是这样的:

db.events.find({timestamp: {$type: 2}}) 
    .forEach(function (e) { 
     e.newTimestamp = new ISODate(e.timestamp); 
     db.events.save(e); 
    }) 

db.events.update({}, 
    {$rename: {'newTimestamp': 'timestamp'}}, 
    {multi: true}) 

顺便说一句,对于字符串时间转换为ISODate s表示方法是什么结束了工作。 (我从this SO answer得到了想法。)

+1

我的建议是将ISODate添加为一个新字段。一旦确认一切看起来不错,您可以取消设置字符串日期。 –

+0

@JamesWahlin即使在支持干运行的SQL中也有正确的想法,我不会这样做 – Sammaye

+0

@JamesWahlin你可以添加你的评论作为答案吗? – bdesham

回答

3

我的建议是将ISODate添加为新字段。一旦确认一切看起来不错,您可以取消设置字符串日期。

4

用你的数据库结构创建一个测试环境。将一些记录复制到它。问题解决了。我敢肯定,不是你寻找的解决方案。但是,我相信,这是'测试环境'应该用于的确切环境。

+0

我想到了。但如果我第一次尝试失败,我必须清除开发环境并重新导入数据 - 可能多次 - 这似乎是我可能避免的一个麻烦。 – bdesham

+0

是的,我认为已经考虑过了,只是认为我会在那里提出这个建议......无论如何,我偶尔会忽略简单的东西,我自己。 – eidsonator

2

选择您想要监控的特定记录的ID。放置在update{_id:{$in:[<your monitored id>]}}

+0

这是一种方法,但如果我搞砸了更新操作,它仍然会打开销毁数据的可能性。 – bdesham

+2

@bdesham在没有备份的情况下尝试实时数据是不好的做法。这是任何生产操作的拇指指引 - 首先创建回滚点 – Dewfy

0

另一种选择取决于会引起你的开销量 - 你可以考虑编写一个脚本,执行查找操作,添加打印输出或在调试时运行,而保存操作被注释掉。一旦你获得了信心,你可以应用保存操作。

var changesLog = []; 
var errorsLog = []; 
events.find({timestamp: {$type: 2}}, function (err, events) { 
    if (err) { 
     debugger; 
     throw err; 
    } else { 
     for (var i = 0; i < events.length; i++) { 
      console.log('events' + i +"/"+(candidates.length-1)); 
      var currentEvent = events[i]; 
      var shouldUpdateCandidateData = false; 

      currentEvent.timestamp = new ISODate(currentEvent.timestamp); 


      var change = currentEvent._id; 
      changesLog.push(change); 

      // // ** Dry Run ** 
      //  currentEvent.save(function (err) { 
      //   if (err) { 
      //    debugger; 
      //    errorsLog.push(currentEvent._id + ", " + currentEvent.timeStamp + ', ' + err); 
      //    throw err; 
      //   } 
      //  }); 
     } 
     console.log('Done'); 
     console.log('Changes:'); 
     console.log(changesLog); 
     console.log('Errors:'); 
     console.log(errorsLog); 
     return; 
    } 
}); 
相关问题