0

質問があります。2つのフィールドの除算が値以上かどうかを比較する必要があります。したがって、私が見つけた解決策は次のとおりです。

{
    "$where": "this.total / this.limit > 0.6"
}

しかし、ドキュメントによると、$ whereを使用すると、javascript関数が実行され、インデックスが失われるため、パフォーマンスには良くありません。

誰かがこれに対してより良い解決策を持っていますか、それは$ whereを使用しませんか?

ありがとう !

4

1 に答える 1

2

ここで分割を使用して集計フレームワークに移動できます ( http://docs.mongodb.org/manual/reference/aggregation/#_S_divide ):

db.col.aggregate([
    {$match: {_id: whatever_or_whatever_clause_you_want}},
    {$project: {
        // Your document fields
        divided_limit: {$divide: ['$total', '$limit']}
    }},
    {$match: {divided_limit: {$gt: 0.6}}}
]);

注: アグリゲーション フレームワークは v2.1 以降の新しいものです。

しかし、ドキュメントによると、 $where の使用は、javascript 関数を実行し、インデックスを失うため、パフォーマンスに適していません。

とにかく、これにインデックスを使用することはできません。このような数学関数にインデックスを使用する方法はありません。重要なことは、JS エンジンは通常のクエリより最大 16 倍遅く、集約フレームワークはより高速であることです。それだけでなく、JS ロックはすべてのクエリに対してグローバルです。

もちろん、最速の方法は、アプリケーションでレコードを変更するときに、この合計を別のフィールドに事前に集計することです。そうすれば、これは必要なく、通常のクエリだけで済みます。

于 2013-02-13T19:24:51.377 に答える