我有一堆orders,其中一些有order_confirmations。
1:我希望根据最后一个orders的DateTime提取一个order_confirmation列表。这是我失败的尝试(返回0条记录):
Order.where(:order_confirmations.exists => true).desc("order_confirmations.last.datetime")2:我希望提取最后一个order_confirmation在5到10天内的orders的列表。这是我失败的尝试(返回0个结果):
Order.lte("order_confirmations.last.datetime" => 5.days.ago).gte("order_confirmations.last.datetime" => 10.days.ago)我的亲戚:
class Order
include Mongoid::Document
has_many :order_confirmations
end
class OrderConfirmation
include Mongoid::Document
field :datetime, type: DateTime
belongs_to :order
end发布于 2013-05-12 21:23:52
存在引用关系时,不能直接查询被引用的单据。
也就是说,您可能希望首先查询订单确认,然后选择订单,如下所示:
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)发布于 2013-05-12 20:13:35
查看elemMatch函数。
where('$elemMatch' => [{...}]我确实认为mongoid中有一个bug,虽然与elemMatch和日期比较有关,但不确定它是否被修复了。
https://stackoverflow.com/questions/16506596
复制相似问题