2

こんにちは、mongoid (mongodb) を使用して基準を超えています:

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

しかし、2 つのフィールドの合計がある数値よりも大きいという条件を実行できるかどうか疑問に思っていました。おそらく次のようなものです(ただし、機能していないようです):

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 に答える