【问题标题】:How to get server time with mongoid 3.x?如何使用 mongoid 3.x 获取服务器时间?
【发布时间】:2016-05-07 04:22:48
【问题描述】:

使用 MongoDB 来安排资源预留。为了确保损坏的客户端不会破坏系统,我想获取服务器时间并基于它进行查询。

我认为服务器端 javascript 可以做到这一点,但 mongoid gem 不直接支持,并且由于似乎有 db 用户权限而无法工作。 我在做:

  time_now = MongoModels::User.collection.database.session.cluster.with_primary do
    MongoModels::User.collection.database.command(eval: """
      function() {.
        var now=new Date()
        return now.toISOString()
      """
    )
  end

我明白了:

failed with error 13: "not authorized on cucushift to execute command { eval:
...

我认为不使用 javascript 的另一种方法是获取服务器状态。它应该包含当地时间。但我找不到通过mongoid 获取服务器状态的方法。

如果有人知道如何获取服务器状态或知道另一种获取服务器本地时间的方法。或者知道如何制作我的查询,以便它与服务器时间而不是客户端机器时间进行比较,那会很棒。谢谢!

更新:看来我也不允许做 serverStatus:

MongoModels::User.collection.database.command(serverStatus: 1)

failed with error 13: "not authorized on cucushift to execute command { serverStatus: 1 }"

这很奇怪 IMO,因为它没有被列为仅管理员。做listCommands我明白了:

"serverStatus"=>
    {"help"=>"returns lots of administrative server statistics",
     "slaveOk"=>true,
     "adminOnly"=>false}

【问题讨论】:

    标签: ruby mongoid


    【解决方案1】:

    对于 Mongoid 3 更直接的方法,请检查服务器时间。它不需要您查询集合:

    Mongoid::Sessions.default.command(ismaster: 1)["localTime"]
    

    对于 Mongoid 5,使用此命令检查服务器时间:

    Mongoid::Clients::Factory.default.command(ismaster: 1).documents[0]["localTime"]
    

    【讨论】:

      【解决方案2】:

      我找到了最好的方法——允许用户请求服务器状态。那是因为serverStatus 命令看起来很安全,并且声称不会影响 mongodb 服务器的性能。为了让帐户首先获得服务器状态,我关注了这个serverfault question

      然后在 ruby​​ 中我执行上述操作:

      server_status = MongoModels::User.collection.database.command(serverStatus: 1)
      

      然后我得到服务器时间:

      [2] pry(#<CucuShift::MongoUserPoolQuery>)> server_status["localTime"]
      => 2014-10-29 09:44:55 UTC
      [3] pry(#<CucuShift::MongoUserPoolQuery>)> server_status["localTime"] + 3600
      => 2014-10-29 10:44:55 UTC
      [4] pry(#<CucuShift::MongoUserPoolQuery>)> server_status["localTime"].class
      => Time
      

      我希望这对将来的人有所帮助。

      顺便说一句,我认为也可以通过保存文档并将其中一个字段设置为服务器当前时间来获取服务器时间。有几种方法 - 请参阅Is there any Equivalent of NOW() in MongoDB。然后阅读文档并在记录插入点获取服务器时间。但我认为这是更重量级的。

      【讨论】:

        猜你喜欢
        • 2011-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-07
        • 2014-08-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多