Как сделать запрос MongoDB сортировать по строкам с постфиксом -number?

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

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 для номеров.

Как бы я это сделал?

Ответы на вопрос(4)

Решение Вопроса

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

 Eugene Kaurov20 нояб. 2018 г., 18:15
db.collectionName.find (). sort ({title: 1}). collation ({locale: "en_US", numericOrdering: true})
 David Anderton17 сент. 2016 г., 19:08
Я бы хотел, чтобы mongodb мог сортировать числа, хранящиеся в виде строк :(

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

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

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

 Gene Lim01 февр. 2019 г., 11:04
Это на самом деле работает. Спасибо!

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

 rodrigorf09 янв. 2018 г., 19:44
это очень интересно! Можете ли вы объяснить, как это работает? Я хочу попробовать. \ О /
 MrE09 янв. 2018 г., 22:43
Строки сортируются в порядке ascii, поэтому для сортировки строк в числовом порядке требуется 1, 10, 2, 3 ... вам нужно обнулить строку, чтобы она оказалась в порядке ascii 01, 02, 03, .. ., 10
 MrE10 янв. 2018 г., 02:16
очевидно, вам нужно дополнить 0 нулями, чтобы охватить весь диапазон целых чисел, которые вы будете использовать, потому что 100 все равно придет раньше 20, если вы только ноль добавите к 2 цифрам. 01, 02 ..., 10 ... 100, 20 должны быть дополнены как 001, 002, 003, ... 010, ... 020, ..., 100 ...

но вы можете сортировать с помощью функции ниже, после того как вы получите все документы из коллекции.

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);
 CertainPerformance16 авг. 2018 г., 10:44
Регулярное выражение может быть более подходящим, чем создание массива только для использования1St Индекс из этого.

Ваш ответ на вопрос