比率属性が浮動小数点数のドキュメントを含むコレクションがあるとします。
{'ratio':1.437}
ドライバーを使用してすべてのドキュメントをメモリにロードせずに、指定された整数に最も近い値を持つ単一のドキュメントを検索し、最小値のドキュメントを検索するクエリを作成するにはどうすればよいabs(x-ratio)
ですか?
比率属性が浮動小数点数のドキュメントを含むコレクションがあるとします。
{'ratio':1.437}
ドライバーを使用してすべてのドキュメントをメモリにロードせずに、指定された整数に最も近い値を持つ単一のドキュメントを検索し、最小値のドキュメントを検索するクエリを作成するにはどうすればよいabs(x-ratio)
ですか?
興味深い問題です。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}
])
別のアイデアがありますが、非常にトリッキーで、データ構造を変更する必要があります。
mongodb でサポートされている地理位置情報インデックスを使用できます
まず、データをこの構造に変更し、2 番目の値を 0 のままにします
{'ratio':[1.437, 0]}
次に、演算子を使用$near
して最も近い比率の値を見つけることができます。演算子は、指定した整数で距離によって並べ替えられたリストを返すためlimit
、最も近い値のみを取得するために使用する必要があります。
db.places.find( { ratio : { $near : [50,0] } } ).limit(1)
これをしたくない場合は、@JohnnyHKの答えを使用できると思います:)