【问题标题】:Can not query TimeStamp oplog.rs by Robomongo tools无法通过 Robomongo 工具查询 TimeStamp oplog.rs
【发布时间】:2015-03-14 16:12:00
【问题描述】:

在 oplog.rs 集合中有如下内容:

{
    "ts" : Timestamp(1401265282, 41),
    "h" : NumberLong(-8979599167307291610),
    "v" : 2,
    "op" : "i",
    "ns" : "test",
    "o" : {
        ...........
    }
}

使用 Robomongo 工具我输入以下查询:

db.oplog.rs.find({"ts": Timestamp(1401265282,41)})

我什么都没得到:(

当我在控制台中使用 mongo 客户端工具时,它可以工作。

那么 Robomongo 工具有什么问题吗?我想用这个工具来管理我们的数据,但是卡在这里。

【问题讨论】:

  • 你切换到本地数据库了吗?
  • 是已经切换到本地,没有找到结果
  • 这是您要连接的副本集成员(希望是主要成员)吗?该集合仅存在于副本集上。
  • 是的,我连接到主服务器,我尝试使用 mongo 客户端控制台没问题,但使用 Robomongo 工具它什么也没找到。

标签: mongodb


【解决方案1】:

这是可能的问题(我在自己的 Robomongo 副本上重新创建了它)。我可以查询在 Robomongo 中运行 db['oplog.rs'].find()db['oplog.rs'].findOne() 并且没有问题。但是当我查询在查询中指定“ts”字段时,它会运行很长时间,然后什么也不返回。

oplog.rs 集合是一个特殊的上限集合。上限是它会在达到设定大小时自动删除最旧的文档 - http://docs.mongodb.org/manual/core/capped-collections/

请注意,对于有上限的集合,通常的方法是按插入顺序进行查询,最年轻或最旧的文档位于排序的顶部:

查询一个上限集合

如果您在没有排序的上限集合上执行 find() 指定,MongoDB 保证结果的顺序是相同的 作为插入顺序。

要以反向插入顺序检索文档,请发出 find() 将 $natural 参数设置为 -1 的 sort() 方法,如图所示 在以下示例中:

db.cappedCollection.find().sort( { $natural: -1 } )

特别之处在于 oplog.rs 有额外的限制,因为它是作为系统级集合控制复制的角色。这导致了一些额外的限制,我稍后会讨论更多。

不过,首先,让我们讨论一下这里发生了什么。 oplog.rs 中的“ts”字段没有索引。因此,如果您已运行任何时间长度的复制,此查询将需要一些时间来运行:

默认情况下,oplog的大小如下:

  • 对于 64 位 Linux、Solaris、FreeBSD 和 Windows 系统,MongoDB 分配 5% 的可用可用磁盘空间,但始终
    分配至少 1 GB 且不超过 50 GB。
  • 对于 64 位 OS X 系统,MongoDB 为 oplog 分配 183 MB 的空间。
  • 对于 32 位系统,MongoDB 为 oplog 分配大约 48 MB 的空间。

这样查询可以运行很长时间。此外,当查询完成时,您的文档可能已被删除。为什么?因为 oplog.rs 将删除最旧的文档以保持在上限以下。但是,如果您执行 findOne() 来拉出示例文档,它可能会对其进行排序以拉出集合中最旧的文档 - 这可能会在几秒钟后被删除。您可以通过在繁忙的系统上重复运行 oplog.rs 上的 findOne() 来自己尝试 - 您每次都会得到不同的文档。

之前有人尝试通过在 oplog.rs 的“ts”字段上创建索引来解决这个问题,但没有奏效。原因是由于 oplog.rs 的特殊性质 - 索引会创建但不会更新。有关详细信息,请参阅此处的讨论:Index on ts field in oplog.rs is not updated

总体而言,Robomongo 的问题可能更严重(错误消息有点少,超时时间不清楚),但根本原因在于 MongoDB 架构。

【讨论】:

    【解决方案2】:

    此问题最近才报告给 Robomongo 问题跟踪器(请参阅:Timestamps being handled incorrectly)。

    这里的问题实际上是由于 Robomongo 0.8.x 使用了旧版本的 mongo shell。

    mongo shell 中的 Timestamp() 构造函数在 MongoDB 2.4 中发生了重大变化:SERVER-7718: Timestamp constructor in shell should take seconds instead of milliseconds

    由于Timestamp() 实现是本机代码而不是JavaScript,我目前不知道有什么解决方法(没有使用普通的mongo shell 进行查询)。这个问题将在 Robomongo 的下一个主要版本(0.9.0 里程碑)中得到解决,但目前还没有 ETA。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-16
      • 1970-01-01
      • 1970-01-01
      • 2017-12-14
      • 1970-01-01
      • 2021-11-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多