Это из-за сравнения строк MongoDB, если я не ошибаюсь, вы можете получить этот заказ "L99" > "L9" > "L100"
, потому что он будет проверять букву за буквой в данной строке, так как L
совпадает во всех документах, тогда это будет go для следующего письма, таким образом, вы получите указанный выше порядок.
1) Если все документы имеют LsNr , начинается с L , попробуйте это:
Запрос:
collection.aggregate([
/** $match similar to .find() */
{ $match: { filter } },
/** $addFields to add a new field 'number' which bring number out of 'L9' -> 9 */
{ $addFields: { number: { $toInt: { $substr: ["$LsNr", 1, -1] } } } },
/** sort number & $project to remove newly created field 'number' */
{ $sort: { number: -1 } }, { $project: { number: 0 } }, {$limit: 1}
])
Тест: MongoDB-Playground
2) Остальные документы имеют LsNr начинается с разных букв, попробуйте это:
Запрос:
collection.aggregate([
{ $match: { filter } }, // Your filter
{ $addFields: { letter: { $substr: ["$LsNr", 0, 1] }, number: { $toInt: { $substr: ["$LsNr", 1, -1] } } } },
{ $sort: { number: -1 } }, { $sort: { letter: -1 } },
{ $project: { letter: 0, number: 0 } }])
Тест: MongoDB-Playground
Вы можете использовать агрегацию для достижения того, что нужно - что-то вроде .find()
. Так как у вас есть фильтр, используйте его на первом этапе $match
, чтобы сделать ваш набор данных меньше для дальнейших этапов, в любом случае, пожалуйста, укажите индекс в поле LsNr
.