Mongodb慢速更新循环

Mongodb慢速更新循环,mongodb,Mongodb,我刚开始熟悉Mongodb,这就是为什么我做了一些愚蠢的事情。我的每个数据集条目都包含一个时间戳(它们是tweet)。在插入之前,我没有将时间戳从字符串转换为实际的日期格式,而是简单地将其作为字符串插入 现在,我的数据集变得越来越大(300多万条推文),我想开始对我的条目进行排序/排列。由于我的时间戳仍然是一个字符串(“Wed Apr 29 09:52:22+0000 2015”),我想将其转换为日期格式 我在这个答案中找到了以下代码: 而且效果很好。然而,这是难以置信的缓慢。根据MongoH

我刚开始熟悉Mongodb,这就是为什么我做了一些愚蠢的事情。我的每个数据集条目都包含一个时间戳(它们是tweet)。在插入之前,我没有将时间戳从字符串转换为实际的日期格式,而是简单地将其作为字符串插入

现在,我的数据集变得越来越大(300多万条推文),我想开始对我的条目进行排序/排列。由于我的时间戳仍然是一个字符串(“Wed Apr 29 09:52:22+0000 2015”),我想将其转换为日期格式

我在这个答案中找到了以下代码:

而且效果很好。然而,这是难以置信的缓慢。根据MongoHub应用程序,它每秒只处理4个查询。对于300多万条推文的数据集,转换大约需要8.6天。我真的希望有办法加快速度,因为我的最后期限是8天


有什么想法吗?

默认情况下,更新块会一直更新到数据库发回它成功执行更新的确认。当您在本地工作站上使用mongo shell并连接到远程数据库时,这将花费至少与您对数据库的ping相同的时间

如果允许这样做,您可以通过SSH连接到数据库服务器(副本集的主服务器)并在那里运行脚本。这将网络延迟降低到几乎为零。当您拥有一个集群时,结果可能仍然会有改进,但不会有太大的改进,因为您需要登录到mongos服务器,该服务器仍然需要等待来自它将更新路由到的副本集的确认

另一个选项是执行更新时不考虑写入问题。然后程序将立即继续执行,这将大大提高速度。但请记住,这样可以忽略任何错误

db.ClockTime.update(
    {_id : doc._id}, 
    {$set : {ClockInTime : new Date(doc.ClockInTime)}},
    {writeConcern: {w: 0}}
)

第三个更快的选项是使用JSON格式导出整个集合的文件,使用本地脚本进行转换,然后使用重新导入转换后的数据。缺点是,如果在导出和导入之间没有短暂的停机时间,您将无法执行此操作,因为其间的任何数据都将丢失。

另一种选择是使用批量操作,这非常快,特别是因为它们可以并行应用

var bulk = db.ClockTime.initializeUnorderedBulkOp()
var myDocs = db.ClockTime.find()
var ops = 0

myDocs.forEach(
  function(myDoc) {
    bulk.find(
      {_id:myDoc._id}
    ).updateOne(
        {$set : { ClockInTime: new Date(myDoc.ClockInTime) } }
    );

    if ( (++ops % 10000) === 0){
      bulk.execute();
      bulk = db.ClockTime.initializeUnorderedBulkOp();
    }
  }
)

bulk.execute()

看这看起来真的很有希望,谢谢@Yogesh链接返回404@JohnDoe看起来像是上述文章的作者,谢谢你的详细回答!实际上,登录到SSH服务器很快就解决了这个问题,并且没有数据丢失,因为我不必导出/导入数据库。
var bulk = db.ClockTime.initializeUnorderedBulkOp()
var myDocs = db.ClockTime.find()
var ops = 0

myDocs.forEach(
  function(myDoc) {
    bulk.find(
      {_id:myDoc._id}
    ).updateOne(
        {$set : { ClockInTime: new Date(myDoc.ClockInTime) } }
    );

    if ( (++ops % 10000) === 0){
      bulk.execute();
      bulk = db.ClockTime.initializeUnorderedBulkOp();
    }
  }
)

bulk.execute()