根据上次has_many关系的DateTime提取Mongoid文档?

时间:2013-05-12 10:52:59

标签: ruby-on-rails mongodb mongoid

我有一堆orders,其中一些有order_confirmations

1:我希望根据上一个orders的{​​{1}}提取DateTime列表。这是我失败的尝试(返回0条记录):

order_confirmation

2:我希望提取Order.where(:order_confirmations.exists => true).desc("order_confirmations.last.datetime") 的列表,其中最后orders的日期为5到10天。这是我失败的尝试(返回0结果):

order_confirmation

我的关系:

Order.lte("order_confirmations.last.datetime" => 5.days.ago).gte("order_confirmations.last.datetime" => 10.days.ago)

2 个答案:

答案 0 :(得分:1)

使用引用的关系,您无法直接查询引用的文档。

那就是说,你可能想先查询订单确认,然后选择这样的订单:

OrderConfirmation.between(datetime: 10.days.ago..5.days.ago)
  .distinct(:order_id).map { |id| Order.find(id) }

如果您在订单中嵌入了确认信息,例如

class Order
  include Mongoid::Document
  embeds_many :order_confirmations
end

class OrderConfirmation
  include Mongoid::Document
  field :datetime, type: DateTime
  embedded_in :order
end

然后,您可以使用$elemMatch查询订单查询中的订单确认:

Order.elem_match(order_confirmations:
  { :datetime.gte => 10.days.ago, :datetime.lte => 5.days.ago })

关于你的第一个问题,我认为只用MongoDB查询就可以做到这一点,所以你可以做类似的事情

# if you go embedded rels
Order.all.map { |o| o.order_confirmations.desc(:datetime).first }
  .sort_by(&:datetime).map(&:order)

# if you stay on referenced rels
OrderConfirmation.desc(:datetime).group_by(&:order)
  .map { |k, v| v.first }.map(&:order)

答案 1 :(得分:0)

查看elemMatch功能。

where('$elemMatch' => [{...}]

我相信mongoid中有一个bug虽然与elemMatch相关并且比较日期,但不确定它是否已被修复。