聚合阶段是否应该分为尽可能多的阶段?

时间:2018-08-28 16:17:18

标签: mongodb aggregation-framework

我有一个聚合管道,该管道具有连续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"
}

0 个答案:

没有答案