基于与Mongoid计算字段查询(Query based on calculated fields

2019-10-31 22:24发布

我想实现一个范围overdue模型中的Invoice返回超出之日起,直到他们不得不支付所有发票。 我有字段invoice_date, :type => Datedays_for_payment, :type => Integer

在我以前的版本,它是建立在ActiveRecord的,我可以使用查询

Invoice.where("invoice_date + days_for_payment < ?", Date.today)

这个查询就这一DB侧的计算。

有没有办法让与Mongoid做同样的事情? 还是没有人知道一个很好的解决方法(PROC,λ,等等)?

我用mongoid“2.4.12”

Answer 1:

找到自己的答案。 随着前缀this.*我可以引用到田间地头。 我可以使用JavaScript功能。 MongoDB中得到凉快了!

因此,这里是我的解决方案:

class Invoice
  include Mongoid::Document
  field :invoice_date, :type => Date
  field :days_for_payment, :type => Integer
  ...

  scope :overdue, where("(Math.round(this.invoice_date.getTime() / 1000) + (this.days_for_payment * 24 * 3600)) < #{Time.now.to_i}")

  ...
end

在JS时间戳创作的作品不同。 因此,我不得不摆脱了最后三个数字的和他们周围。 如果有人知道一个更优雅的方式,请让我知道。

我留下唯一的问题是,我不能存储Date对象的MongoDB。 它总是告诉我,我必须使用Time 。 我想我最好升级到mongoid 3.0.1。



Answer 2:

我不知道mongoid ,如果你要查询的MongoDB直接就可以使用,其中运营商$ 。 这是不建议,因为它不使用索引。 如果您有过滤记录一小部分,那么你可以使用$另一种情况,其中,以进一步过滤。



文章来源: Query based on calculated fields with Mongoid