2

嗨,我正在使用 mongoid (mongodb) 来超越标准:

Account.where(:field1.gt => 10)

但我想知道是否可以制定一个标准,其中两个字段的总和大于某个数字。也许是这样的(但似乎不起作用):

Account.where(:'field1 + field2'.gt => 10)

也许需要一些嵌入式javascript?谢谢!

4

2 回答 2

1

我建议使用 Piotr 建议的 Mongoid 3 语法,但如果你想提高性能,以牺牲一些存储开销为代价,你可以尝试这样的事情:

class Account
  # ...
  field :field1, :type => Integer
  field :field2, :type => Integer
  field :field3, :type => Integer, default -> { field1 + field2 }

  index({ field3: 1 }, { name: "field3" })

  before_save :update_field3

private

  def update_field3
    self.field3 = field1 + field2
  end

end

然后您的查询看起来更像:

Account.where(:field3.gte => 10)

field3请注意文档更改时要更新的回调。还为它添加了一个索引。

于 2012-08-22T22:59:25.217 回答
0

您可以使用 MongoDB 的javascript 查询语法

因此,您可以执行以下操作:

Account.collection.find("$where" => '(this.field1 + thist.field2) > 10')

或者在 Mongoid 3 中,以下内容也可以使用

Account.where('(this.field1 + thist.field2) > 10')

正如 Sammaye 在评论中提到的那样,它引入了性能惩罚,因为必须为每个文档单独执行 javascript。如果您不经常使用该查询,那没关系。但是,如果您这样做,我建议添加另一个字段,该字段将作为该字段的聚合,field1然后field2基于该字段进行查询。

于 2012-08-17T17:33:03.837 回答