AWS DocumentDB下$lookup过滤无匹配子文档时如何保留父文档并返回计数0
解决方案
你原查询的问题出在$unwind后的$match会将所有宠物均为DEAD的Owner记录直接过滤掉,我们可以直接对$lookup返回的pets数组做过滤统计,不需要拆分再合并,即可避免丢失Owner记录,同时满足需求。
修改后的完整查询语句如下:
db.Owners.aggregate( [ // 原有过滤条件保持不变,可替换为任意业务过滤规则 { $match: {_id: { $in: [ UUID("cbb921f6-50f8-4b0c-833f-934998e5fbff") ] } } }, // 关联查询Pets集合获取当前Owner的所有宠物,保持不变 { $lookup: { from: 'Pets', localField: '_id', foreignField: 'ownerId', as: 'pets' } }, // 直接统计排除DEAD状态的宠物数量 { $addFields: { petCount: { $size: { $filter: { input: "$pets", cond: { $ne: [ "$$this.state", "DEAD" ] } } } } } }, // 移除临时的pets字段,返回结构和原生Owner文档完全一致 { $project: { pets: 0 } } ]).pretty()
方案说明
- 兼容AWS DocumentDB 4.0版本,用到的
$filter数组操作符在该版本已原生支持 - 不会丢失任何符合
$match过滤条件的Owner记录,无宠物、所有宠物均为DEAD的Owner的petCount会自动返回0 - 相比原写法省去了
$unwind和$group步骤,执行效率更高 - 返回的文档结构和原生Owner文档完全一致,仅新增
petCount字段,适配Java POJO映射规则
内容的提问来源于stack exchange,提问作者MarcB
相关产品推荐
相关产品推荐

