2013-11-07 2 views
2

Наша заявка основана на MongoDB. Мы сохраняем «имена», «версии» и различные атрибуты ИТ-активов в MongoDB. У нас есть новое требование поиска, в котором нам нужно получить последнюю версию активов на основе ключевых слов. Улов здесь состоит в том, что мои номера версий имеют формат xyz (то есть major.minor.maintenance)Mongodb сортировать по версии x.y.z

В принципе, я должен иметь набор результатов, отсортированный сначала по основной версии (desc), затем второстепенную (desc) и затем версия обслуживания (desc). , например. Для номеров версий, приведенных ниже: 1.0.10 1.1.0 11.0.0 2.0.1 Отсортированная версия должна быть: 1.0.10 1.2.10 2.0.1 11.0.0 Можно для меня правильно сортировать его на слое Mongo? К сожалению, номер версии просто сохраняется как одно строковое значение, а не структурированный объект в формате x.y.z.

Заранее благодарен! Zeba

+4

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

+0

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

+0

Чтобы избежать нарушения ваших зависимостей, создайте другое поле версии, исходя из того, которое у вас уже есть, и используйте его для сортировки. – Rafa

ответ

0

Вам нужно сохранить второе представление поля, mongo не может сортировать семантические версии. Я выбрал для каждого компонента 4 символа.

var document = { 
    version: "1.2.3", 
    padded_version: "0001.0002.0003", 
} 

Тогда вы можете сортировать по индексу лексикографической строки.

db.ensureIndex({ padded_version: -1 }) 

Вы также можете немного сдвигать каждый компонент:

var document = { 
    version: "1.2.3", 
    integer_version: 1 << 16 + 2 << 8 + 3, 
} 

Это ограничивает вас 256 новых версий, однако с потенциальными проблемами переполнения и т.д. Я бы придерживаться с нулями строки версии.

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