Чтобы отсортировать документы по вычисленному значению (например, по длине строки), нужно временно создать это значение, использовать его для сортировки, а затем удалить его из результатов. Это делается с помощью трёхэтапного конвейера агрегации.
$addFields — вычисляет и добавляет временное поле к каждому документу$sort — упорядочивает документы по этому вычисленному полю$project — удаляет временное поле из финальных результатовОтсортируй сотрудников по длине поля name в символах (сначала самые длинные), а затем исключи вспомогательное поле из результатов:
db.employees.aggregate([
{ $addFields: { nameLength: { $strLenCP: "$name" } } },
{ $sort: { nameLength: -1 } },
{ $project: { nameLength: 0 } }
])
$addFields использует $strLenCP для вычисления количества символов Unicode в поле name и сохраняет результат в nameLength$sort: { nameLength: -1 } упорядочивает результаты от самых длинных к самым коротким$project: { nameLength: 0 } исключает nameLength из результатов, оставляя вывод чистымСхема добавить → отсортировать → удалить — распространённый приём агрегации, когда нужно отсортировать по значению, которого нет среди хранимых полей. Временное поле существует только внутри конвейера и никогда не записывается в коллекцию.
Оператор $strLenCP вычисляет длину строки с учётом Unicode, то есть корректно обрабатывает многобайтовые символы вроде эмодзи и букв с диакритикой.
Новый — ещё не проверен сообществом
Вы