Ответ 1
MongoDB не может сортировать по номерам, хранящимся в виде строк. Вам нужно либо сохранить номер в виде целого в своем поле, и заполнить начальные нули, либо отсортировать результаты после того, как они были возвращены из базы данных.
У меня есть запрос:
ownUnnamedPages = Entries.find( { author : this.userId, title : {$regex: /^unnamed-/ }}, {sort: { title: 1 }}).fetch()
Это возвращает следующий отсортированный массив:
[ {
title: 'unnamed-1',
text: '<p>sdaasdasdasd</p>',
tags: [],
_id: 'Wkxxpapm8bbiq59ig',
author: 'AHSwfYgeGmur9oHzu',
visibility: 'public' },
{
title: 'unnamed-10',
text: '',
author: 'AHSwfYgeGmur9oHzu',
visibility: 'public',
_id: 'aDSN2XFjQPh9HPu4c' },
{
title: 'unnamed-2',
text: '<p>kkhjk</p>',
tags: [],
_id: 'iM9FMCsyzehQvYGKj',
author: 'AHSwfYgeGmur9oHzu',
visibility: 'public' },
{
title: 'unnamed-3',
text: '',
tags: [],
_id: 'zK2w9MEQGnwsm3Cqh',
author: 'AHSwfYgeGmur9oHzu',
visibility: 'public' }]
Проблема заключается в том, что он, кажется, сортирует первый цифровой символ, поэтому он считает, что правильная последовательность - 1, 10, 2, 3 и т.д. я действительно хочу, чтобы он сортировал и всю цифровую часть, чтобы 10 были в конце.
Я бы предпочел не делать этого, добавив дополнительные цифры, такие как 01 или 001 для чисел.
Как мне это сделать?
MongoDB не может сортировать по номерам, хранящимся в виде строк. Вам нужно либо сохранить номер в виде целого в своем поле, и заполнить начальные нули, либо отсортировать результаты после того, как они были возвращены из базы данных.
Если вы нажмете цифры, которые вы сможете найти в строке в правильном порядке, то вместо 0,1,2,3,4,5,6,7,8,9,10,11... использование 01,02,03,04,05,06,07,08,09,10,11... и строковый поиск вернет их по порядку.
Ты можешь использовать
db.collectionName.find().sort({title: 1}).collation({locale: "en_US", numericOrdering: true})
Флаг numericOrdering имеет логическое значение и является необязательным. Флаг, который определяет, сравнивать ли числовые строки как числа или как строки. Если это правда, сравните как числа; то есть "10" больше, чем "2". Если false, сравнить как строки; то есть "10" меньше, чем "2". По умолчанию установлено значение false.
В Монго это невозможно (сортировка строк в ascii), но вы можете сортировать с помощью функции ниже, после того как вы получите все документы из коллекции.
const sortString = (a, b) => {
const AA = a.title.split('-');
const BB = b.title.split('-');
if (parseInt(AA[1], 10) === parseInt(BB[1], 10)) {
return 0;
}
return (parseInt(AA[1], 10) < parseInt(BB[1], 10)) ? -1 : 1;
};
document.sort(sortString);
В моем случае мы работаем с агрегатами. Подход заключался в сортировке по длине нашей строки; работает только тогда, когда текстовая часть всегда одинакова (unnamed- в вашем случае)
db.YourCollection.aggregate([
{
$addFields: {
"TitleSize": { $strLenCP: "$Title" }
}
},
{
$sort: {
"TitleIdSize": 1,
"Title": 1
}
}
]);
Теперь мы сортируем, используя длину, вторая сортировка будет использовать содержимое.
Пример:
Первая сортировка разместит идентификаторы в следующем порядке: 2, 7, 1, 30. Затем второй вид будет располагать идентификаторы в правильном порядке: 1, 2, 7, 30.