У меня есть конвейер агрегации, который имеет 3 $addFields
этапов подряд, которые создают поле на первом этапе, а затем изменяют это поле на последующих этапах. В настоящее время я делаю это:
- Разбить строку на поле
filename
, удалить пустые строки и сохранить результат в path
- Удалить последний элемент из массива
path
- Преобразование массива в строку без последнего элемента
Рекомендуется ли делать это или рекомендуется делать все это как можно меньше?
[
{
$addFields: {
path: {
$filter: {
input: { $split: ['$filename', '/'] },
as: 'str',
cond: { $ne: ['$$str', ''] }
}
}
}
}, {
$addFields: {
path: {
$slice: ['$path', { $subtract: [{ $size: '$path' }, 1] }]
}
}
}, {
$addFields: {
path: {
$reduce: {
input: '$path',
initialValue: '',
in: { $concat: ['$$value', '/', '$$this'] }
}
}
}
}
]
После того, как три вышеупомянутых этапа выполнены, у меня есть четвертый этап, который сопоставляет новую строковую версию пути (структура каталогов без имени файла) со строкой запроса, полученной с моего веб-сайта:
{ $match: { path: '/media/dog' } }
, который затем дает мне нужные списки документов, которые будут вторым документом в следующем списке документов (созданных с использованием GridFSBucket):
{
_id:ObjectID('5b77346bc6b2964358362f37'),
length:355856562,
chunkSize:261120,
uploadDate:"2018-08-17 15:47:51.565",
filename:"/media/bbb.mp4",
md5:"7a7bc8ae38ccbd700e07977a9deb8cb7"
}
{
_id:ObjectID('5b771b695b111820546bdcdf'),
length:355856562,
chunkSize:261120,
uploadDate:"2018-08-17 15:47:51.565",
filename:"/media/dog/bbb.mp4",
md5:"7a7bc8ae38ccbd700e07977a9deb8cb7"
}