こんにちは、mongoid (mongodb) を使用して基準を超えています:
Account.where(:field1.gt => 10)
しかし、2 つのフィールドの合計がある数値よりも大きいという条件を実行できるかどうか疑問に思っていました。おそらく次のようなものです(ただし、機能していないようです):
Account.where(:'field1 + field2'.gt => 10)
埋め込みの JavaScript が必要なのかもしれません。ありがとう!
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
ドキュメントが変更されたときに更新するコールバックに注意してください。そのための索引も追加しました。
MongoDBのjavascriptクエリ構文を使用できます。
したがって、次のようなことができます。
Account.collection.find("$where" => '(this.field1 + thist.field2) > 10')
または、Mongoid 3では、以下も機能します
Account.where('(this.field1 + thist.field2) > 10')
Sammayeがコメントで述べたように、javascriptはすべてのドキュメントに対して個別に実行する必要があるため、パフォーマンスが低下します。そのクエリを頻繁に使用しない場合は、問題ありません。ただし、そうする場合は、の集計となる別のフィールドを追加して、そのフィールドに基づいてクエリを実行することをお勧めしfield1
ますfield2
。