2014-09-28 2 views
1

У меня есть поле code, которое содержит значение в шестнадцатеричном формате.Mongoose найти максимальное значение поля с шестнадцатеричным значением

Как получить максимальное значение в коллекции в одном запросе мангуста?

Если у меня есть несколько коллекций с тем же полем code, есть ли способ получить наивысшее значение на основе всех коллекций в одном запросе?

+0

«значение в шестнадцатеричной системе». Это строка, не так ли? – soulcheck

+0

Да, это строка. – Vadorequest

+0

, вероятно, лучшим выбором было бы добавить поле чисел, представляющее это значение. – soulcheck

ответ

1

Как правило, чтобы найти максимальное значение поля, которое нужно либо:

  1. имеет индекс на этом поле - то поиск относительно быстро - вы просто взять первый элемент в обратном роде. Проблема здесь в том, что если вы индексируете шестнадцатеричные строки, порядок будет лексикографическим, поэтому максимальным будет лексикографический максимум набора строк.

    Именно поэтому добавление целочисленного поля было бы лучшим выбором, если эта операция будет повторяться много раз.

    Кроме того, это, вероятно, лучше с чистой точки зрения моделирования данных. Поле на самом деле является целым числом, шестнадцатеричная строка - это просто его представление, поэтому, возможно, оно должно быть преобразовано в шестнадцатеричное только при представлении конечному пользователю?

  2. Итерировать все элементы коллекции при сохранении и обновлении максимального значения. Это можно легко сделать с помощью простого .forEach на Монго курсора:

    var max = some_small_value; 
    cur.forEach(function (doc) { 
        var current = parseInt(doc.field, 16); 
        if (max < current) { 
         max = current; 
        } 
    }); 
    

    Или мангуст, используя потоки запросов:

    var stream = Model.find().stream(); 
    var max = some_small_value; 
    
    stream.on('data', function (doc) { 
        var current = parseInt(doc.field, 16); 
        if (max < current) { 
         max = current; 
        } 
    }); 
    stream.on('close', function() { 
        // do something with max 
    }) 
    
+0

Спасибо. Я думаю, что лучшим решением в моем случае является взять последнюю строку и взять ее «код», последний из которых всегда будет иметь наибольшее значение в коллекции. Было бы неплохо обходным путем здесь, я думаю, предполагая, что самая высокая ценность всегда самая последняя. – Vadorequest

+0

@ Vadorequest да, если вы можете предположить, что тогда проблема проще - вам нужно это значение из последнего документа. – soulcheck

+0

Я имею в виду, что это все та же проблема - поиск документа с максимальным значением, но по крайней мере это значение является датой и легко индексируется. – soulcheck

Смежные вопросы