興味深い問題。 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
があるかを確認します。 ターゲット整数に最も近い。
MongoDB3.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}
])