Как сортировать документы по настраиваемому (не натурально упорядоченному) полю
Я экспериментирую с MongoDB и его структурой агрегации. С помощью операции размотки я могу разделить документ с полем массива на несколько документов для каждого индекса массива. Теперь, если в массиве есть данные, которые не имеют естественного порядка сортировки, как я могу отсортировать их в MongoDB?
Пример:
Коллекция товаров содержит следующие документы (поле _id пропущено)
{ "type" : "t-shirt", "size" : [ "S", "M", "L" ] }
{ "type" : "pants", "size" : [ "XS", "S", "M", "L", "XL" ] }
После размотки сбора данных size
поле, результаты
{ "type" : "t-shirt", "size" : "S" }
{ "type" : "t-shirt", "size" : "M" }
{ "type" : "t-shirt", "size" : "L" }
{ "type" : "pants", "size" : "XS" }
{ "type" : "pants", "size" : "S" }
{ "type" : "pants", "size" : "M" }
{ "type" : "pants", "size" : "L" }
{ "type" : "pants", "size" : "XL" }
Поле размера не имеет естественного порядка, например, XL и XS отсортированы рядом друг с другом, хотя они должны быть отсортированы по первой / последней позиции.
Вначале я решил эту проблему, спроецировав каждый размер на соответствующее число, то есть XS=1, S=2... Но есть ли более простой способ выполнения пользовательских сортировок?
1 ответ
Да, нет более простого способа, но у вас есть три способа сделать это,
1) как вы указали, вы можете использовать $project
и положить положить номер 123 в соответствии с размером и отсортировать его по этим числам
2) вы можете отсортировать по второму символу строки размера asc по символу substr 2 и отсортировать его
3) использовать $text
сортировать в зависимости от его веса