MongoDB $lookup聚合查询:仅返回关联集合中子集合匹配语言的条目
MongoDB $lookup聚合查询:仅返回关联集合中子集合匹配语言的条目
这个需求很常见,咱们只需要在聚合管道里给关联后的images数据加一层过滤逻辑就能解决。核心思路是:在$lookup关联完数据后,遍历每个关联的image文档,对它的title数组进行筛选,只保留和当前post的lang一致的条目。
修改后的聚合代码示例
Post.aggregate([ { $match: query }, { $lookup: { from: 'images', localField: '_id', foreignField: 'post_id', as: 'images', }, }, { $addFields: { images: { $map: { input: '$images', // 遍历所有关联的image as: 'image', in: { // 合并原image的所有字段,同时替换title为过滤后的结果 $mergeObjects: [ '$$image', { title: { // 先过滤出匹配当前post语言的title条目 $arrayElemAt: [ { $filter: { input: '$$image.title', as: 'titleEntry', cond: { $eq: ['$$titleEntry.lang', '$lang'] } } }, 0 // 取过滤后的第一个元素(因为每个语言应该只有一个条目) ] } } ] } } } } } ]);
代码解释
$map遍历关联的images:逐个处理每个从images集合关联过来的文档。$mergeObjects保留原字段:不用手动列出_id、post_id等字段,直接合并原image对象和修改后的title,保证其他字段不受影响。$filter筛选匹配语言的title:从title数组中挑出lang等于当前post的$lang的条目。$arrayElemAt转为单个对象:因为通常每个语言在title数组里只会有一个条目,用这个操作把过滤后的数组转为单个对象,避免返回数组格式的title。
如果你的场景中允许一个image对应多个同语言的title条目,只需要去掉$arrayElemAt部分,直接保留$filter的结果即可。
备注:内容来源于stack exchange,提问作者klabak
相关产品推荐
相关产品推荐

