MongoDB Mongid time gt query ?

hz_qiuyuanxin · 2013年09月30日 · 最后由 hz_qiuyuanxin 回复于 2013年10月09日 · 8204 次阅读

如下:

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

这样就对了。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号