Vấn đề thú vị. Tôi không biết liệu bạn có thể làm điều đó trong một truy vấn duy nhất hay không, nhưng bạn có thể làm điều đó trong cả hai:
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);
Sau đó, bạn chỉ cần kiểm tra xem tài liệu nào trong hai tài liệu có tỷ lệ ratio
gần nhất với số nguyên đích.
Bản cập nhật MongoDB 3.2
Bản phát hành 3.2 bổ sung hỗ trợ cho $abs
toán tử tổng hợp giá trị tuyệt đối hiện cho phép điều này được thực hiện trong một aggregate
duy nhất truy vấn:
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}
])