2

所以这个问题是两年前的:

查询 Mongoid/rails 3 中的嵌入对象(“低于”、Min 运算符和排序)

以及它建议查询小于或大于的嵌套对象的方式:

current_user.trips.where('start.time' => {'$gte' => Time.now}).count

根本不起作用,对于我这样的众多查询,它返回 0,这是错误的。我也试过

current_user.trips.where(:'start.time'.gte => Time.now}).count

这也是 0。这些实际上都没有引发错误。

现在查询嵌套元素的正确语法是什么?似乎对此有点困惑。

4

1 回答 1

2

它在我的环境中按您期望的那样工作。(mongoid 3.1.3)

class User
  include Mongoid::Document
  embeds_many :trips
end

class Trip
  include Mongoid::Document
  embeds_one :start
  embedded_in :user
end

class Start
  include Mongoid::Document
  field :time, type: DateTime
  embedded_in :trip
end

User.create({ trips: [
  Trip.new({ start: Start.new({ time: 5.days.ago }) }),
  Trip.new({ start: Start.new({ time: 2.days.from_now }) })
] })

current_user = User.where({}).first

p current_user.trips.where('start.time' => {'$gte' => Time.now}).count
p current_user.trips.where(:'start.time'.gte => Time.now).count

上面的代码输出如下:

1
1

真的$gte正确吗?在比较日期时使用相反的符号是一个常见的错误。

或者可能是因为您使用的是旧版本的 Mongoid。

更新:

您可以使用以下代码检查 Mongoid 生成的查询:

Mongoid.logger.level = Logger::DEBUG
Moped.logger.level = Logger::DEBUG
Mongoid.logger = Logger.new($stdout)
Moped.logger = Logger.new($stdout)

这对于调试很有用。

于 2013-05-13T03:00:05.720 回答