【问题标题】:Mongodb slow update loopMongodb慢更新循环
【发布时间】:2015-07-13 16:33:29
【问题描述】:

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

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

我在这个答案中找到了以下代码: How do I convert a property in MongoDB from text to date type?

> var cursor = db.ClockTime.find()
> while (cursor.hasNext()) {
... var doc = cursor.next();
... db.ClockTime.update({_id : doc._id}, {$set : {ClockInTime : new Date(doc.ClockInTime)}})
... }

而且效果很好。但是,它的速度非常慢。根据 MongoHub 应用程序,它每秒只处理 4 个查询。对于 3+ 百万条推文的数据集,转换大约需要 8.6 天。我真的希望有一种方法可以加快速度,因为我的截止日期是 8 天 :P

有什么想法吗?

【问题讨论】:

  • 看这个article
  • 这看起来很有希望,谢谢!
  • @Yogesh 链接返回 404
  • @JohnDoe 它看起来像上面文章的作者删除文章

标签: mongodb


【解决方案1】:

另一种选择是使用非常快的批量操作,尤其是the unordered variant,因为它们可以并行应用。

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

【讨论】:

    【解决方案2】:

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

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

    另一种选择是执行更新而不涉及写入问题。然后程序执行将立即继续,这将大大提高速度。但请记住,这样任何错误都会被忽略。

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

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

    【讨论】:

    • 感谢您的详细解答!确实登录到 SSH 服务器很快就解决了这个问题,并且没有数据丢失,因为我不必导出/导入数据库。
    猜你喜欢
    • 1970-01-01
    • 2016-03-08
    • 2021-05-31
    • 2020-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    相关资源
    最近更新 更多