如何使用mongoid 3.x获取服务器时间?

时间:2014-10-22 21:16:03

标签: ruby mongoid

使用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}

2 个答案:

答案 0 :(得分:1)

有关Mongoid 3的更直接方法,请使用此方法检查服务器时间。它不需要您查询集合:

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

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

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

答案 1 :(得分:0)

我找到了最好的方法 - 允许用户请求服务器状态。这是因为serverStatus命令看起来是安全的并声称不会影响mongodb服务器性能。要使帐户首先获得服务器状态,请遵循此serverfault question

然后在红宝石中我做了上面提到的:

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

我希望将来可以帮助某人。

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