0

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

1:我希望orders根据DateTime其最后一个提取列表order_confirmation。这是我失败的尝试(返回 0 条记录):

Order.where(:order_confirmations.exists => true).desc("order_confirmations.last.datetime")

2:我希望提取orders最后一个order_confirmation在 5 到 10 天之间的列表。这是我失败的尝试(返回 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
4

2 回答 2

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)
于 2013-05-12T13:23:52.350 回答
0

查看 elemMatch 函数。

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

我确实相信 mongoid 中存在一个错误,尽管与 elemMatch 和比较日期有关,但不确定它是否已修复。

于 2013-05-12T12:13:34.763 回答