Интересная проблема. Я не знаю, можете ли вы сделать это в одном запросе, но вы можете сделать это двумя:
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);
Затем вы просто проверяете, какой из двух документов имеет ratio
, ближайший к
MongoDB 3.2 Update
В выпуске 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}
])
45 символов .
Вы могли бы ожидать, что адрес будет
0000:0000:0000:0000:0000:0000:0000:0000
8 * 4 + 7 = 39
8 групп из 4 цифр с 7 :
между ними.
, Но если Вы имеете отображенный на IPv4 адрес IPv6 , последние две группы могут быть записаны в основе 10 разделенных .
, например, [::ffff:192.168.100.228]
. Выписанный полностью:
0000:0000:0000:0000:0000:ffff:192.168.100.228
(6 * 4 + 5) + 1 + (4 * 3 + 3) = 29 + 1 + 15 = 45
Примечание, это - соглашение входа/дисплея - это - все еще адрес на 128 битов, и для устройства хранения данных, вероятно, было бы лучше стандартизировать на разделенном формате необработанного двоеточия, т.е. [0000:0000:0000:0000:0000:ffff:c0a8:64e4]
для адреса выше.
Отвеченный мой собственный вопрос:
адреса IPv6 обычно пишутся как восемь групп из четырех шестнадцатеричных цифр, где каждая группа разделяется двоеточием (:).
, Таким образом, это - 39 символов [максимум 113]