Как сделать запрос запроса MongoDB для строк с номером -number postfix?

У меня есть запрос:

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 для чисел.

Как мне это сделать?

Ответ 1

MongoDB не может сортировать по номерам, хранящимся в виде строк. Вам нужно либо сохранить номер в виде целого в своем поле, и заполнить начальные нули, либо отсортировать результаты после того, как они были возвращены из базы данных.

Ответ 2

Если вы нажмете цифры, которые вы сможете найти в строке в правильном порядке, то вместо 0,1,2,3,4,5,6,7,8,9,10,11... использование 01,02,03,04,05,06,07,08,09,10,11... и строковый поиск вернет их по порядку.

Ответ 3

Ты можешь использовать

db.collectionName.find().sort({title: 1}).collation({locale: "en_US", numericOrdering: true})

Флаг numericOrdering имеет логическое значение и является необязательным. Флаг, который определяет, сравнивать ли числовые строки как числа или как строки. Если это правда, сравните как числа; то есть "10" больше, чем "2". Если false, сравнить как строки; то есть "10" меньше, чем "2". По умолчанию установлено значение false.

Ответ 4

В Монго это невозможно (сортировка строк в 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);

Ответ 5

В моем случае мы работаем с агрегатами. Подход заключался в сортировке по длине нашей строки; работает только тогда, когда текстовая часть всегда одинакова (unnamed- в вашем случае)

db.YourCollection.aggregate([
  {
    $addFields: {
      "TitleSize": { $strLenCP: "$Title" }
    }
  },
  {
    $sort: {
      "TitleIdSize": 1,
      "Title": 1
    }
  }
]);

Теперь мы сортируем, используя длину, вторая сортировка будет использовать содержимое.

Пример:

  • "unnamed- 2", Размер заголовка: 9
  • "unnamed- 7", размер заголовка: 9
  • "unnamed- 30", размер заголовка: 10
  • "unnamed- 1", размер заголовка: 9

Первая сортировка разместит идентификаторы в следующем порядке: 2, 7, 1, 30. Затем второй вид будет располагать идентификаторы в правильном порядке: 1, 2, 7, 30.