17

比率属性が浮動小数点数のドキュメントを含むコレクションがあるとします。

{'ratio':1.437}

ドライバーを使用してすべてのドキュメントをメモリにロードせずに、指定された整数に最も近い値を持つ単一のドキュメントを検索し、最小値のドキュメントを検索するクエリを作成するにはどうすればよいabs(x-ratio)ですか?

4

2 に答える 2

30

興味深い問題です。1 つのクエリで実行できるかどうかはわかりませんが、2 つのクエリで実行できます。

var x = 1; // given integer
closestBelow = db.test.find({ratio: {$lte: x}}).sort({ratio: -1}).limit(1);
closestAbove = db.test.find({ratio: {$gt: x}}).sort({ratio: 1}).limit(1);

次に、2 つのドキュメントのどちらがratioターゲット整数に最も近いかを確認します。

MongoDB 3.2 アップデート

3.2 リリースでは、絶対値集計演算子のサポートが追加され、単一のクエリ$absでこれを実行できるようになりました。aggregate

var x = 1;
db.test.aggregate([
    // Project a diff field that's the absolute difference along with the original doc.
    {$project: {diff: {$abs: {$subtract: [x, '$ratio']}}, doc: '$$ROOT'}},
    // Order the docs by diff
    {$sort: {diff: 1}},
    // Take the first one
    {$limit: 1}
])
于 2012-11-07T18:25:25.157 に答える
7

別のアイデアがありますが、非常にトリッキーで、データ構造を変更する必要があります。

mongodb でサポートされている地理位置情報インデックスを使用できます

まず、データをこの構造に変更し、2 番目の値を 0 のままにします

{'ratio':[1.437, 0]}

次に、演算子を使用$nearして最も近い比率の値を見つけることができます。演算子は、指定した整数で距離によって並べ替えられたリストを返すためlimit、最も近い値のみを取得するために使用する必要があります。

db.places.find( { ratio : { $near : [50,0] } } ).limit(1)

これをしたくない場合は、@JohnnyHKの答えを使用できると思います:)

于 2012-11-07T19:42:58.633 に答える