You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 03:06:01