【问题标题】:Nested Querying in Mongoid in 20132013 年 Mongoid 中的嵌套查询
【发布时间】:2013-05-06 22:23:04
【问题描述】:

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

Querying embedded objects in Mongoid/rails 3 ("Lower than", Min operators and sorting)

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

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

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

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

这也是 0。这些实际上都不会引发错误。

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

【问题讨论】:

  • 删除了我的答案,以便其他人尝试回答,抱歉我帮不上忙...
  • @Sparda 它的盛大,感谢您的帮助,您的原始答案似乎很接近

标签: ruby-on-rails mongodb mongoid mongoid3 nested-queries


【解决方案1】:

它在我的环境中按您期望的那样工作。 (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)

这对调试很有用。

【讨论】:

  • 感谢您的回答 :) 我不想使用 embeds_one/embedded_in,而是使用 has_one/belongs_to,不要认为这是导致问题的原因。版本相同,即使current_user.trips.first.start.time 没问题,仍然给我回零...
  • has_oneembeds_one 不同。 MongoDB 不支持 Join 操作。输出 Mongoid 的日志会帮助你理解其中的区别。
  • 哦,我知道,这就是我指出的原因!可能就是这样。
  • 使用 has_one/has_many 关系的嵌套查询在 MongoDB 中是不可能的。这是 MongoDB 的一个限制,甚至 Object Document Mapper 也无法解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
  • 1970-01-01
  • 2021-07-21
  • 2015-05-13
  • 2011-10-03
  • 2011-04-26
相关资源
最近更新 更多