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