MongoDB Mongid time gt query ?

hz_qiuyuanxin · September 30, 2013 · Last by hz_qiuyuanxin replied at October 09, 2013 · 8206 hits

如下:

33] pry(main)> Tweet.last.c_at.to_s
=> "2013-09-30 12:39:25 +0800"
[34] pry(main)> Tweet.last.c_at
=> Mon, 30 Sep 2013 12:39:25 CST +08:00
[35] pry(main)> Tweet.gt(c_at: "2013-09-30 12:39:25 +0800").count
=> 1
[36] pry(main)> Tweet.gt(c_at: "Mon, 30 Sep 2013 12:39:25 CST +08:00").count
=> 0

由于时间格式的不一样,导致比对出来的结果也不一样,请问有人遇到过么?

Mon, 30 Sep 2013 12:39:25 CST +08:00 是 ruby 的 DateTime 对象 inspect 的结果

查询时直接给 Time / Date 对象就好 给字符串的话,要符合 iso8601 的格式 (例如 Time.now.iso8601)

[6] pry(main)> User.gt(c_at: User.last.c_at).count
...
command={:count=>"users", :query=>{"c_at"=>{"$gt"=>2013-09-26 13:44:02 UTC}}} (0.4709ms)
...
=> 0

[7] pry(main)> User.gt(c_at: User.last.c_at.iso8601).count
...
command={:count=>"users", :query=>{"c_at"=>{"$gt"=>2013-09-26 13:44:02 UTC}}} (0.6018ms)
...
=> 1

很奇怪,产生的 query 都一样,结果不一样

#2 楼 @williamherry 应该是因为数据库存的时间里还有毫秒 query 显示不出来?

类型的问题,丢个 String 进去会查不到东西的

User.last.c_at.class #=> ActiveSupport::TimeWithZone
User.last.c_at.iso8601.class #=> String

查询的方法也有点问题,应该是这样

User.where(:c_at.gt => Time.parse(User.last.c_at.iso8601))

这样就对了。

You need to Sign in before reply, if you don't have an account, please Sign up first.