Следует ли разбивать этапы агрегации на столько этапов, сколько возможно? - PullRequest
0 голосов
/ 28 августа 2018

У меня есть конвейер агрегации, который имеет 3 $addFields этапов подряд, которые создают поле на первом этапе, а затем изменяют это поле на последующих этапах. В настоящее время я делаю это:

  1. Разбить строку на поле filename, удалить пустые строки и сохранить результат в path
  2. Удалить последний элемент из массива path
  3. Преобразование массива в строку без последнего элемента

Рекомендуется ли делать это или рекомендуется делать все это как можно меньше?

[
  {
    $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"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...