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

MongoDB使用aggregate按数组长度与total值匹配过滤文档

MongoDB Aggregate 查询实现方案

核心思路

因为container下的subContainer是动态键名,我们可以先通过$objectToArray将container对象转换为键值对数组,再遍历数组判断是否存在符合条件的arr,最终结合total字段的存在性做筛选。

完整查询语句

db.collection.aggregate([
  // 新增临时字段判断当前文档是否符合筛选条件
  {
    $addFields: {
      isMatch: {
        $cond: {
          if: { $not: [{ $exists: ["$total", true] }] },
          // 条件1:不存在total字段直接符合要求
          then: true,
          // 条件2:存在total字段时,判断是否有任意subContainer的arr长度小于total
          else: {
            $anyElementTrue: {
              $map: {
                input: { $objectToArray: "$container" },
                as: "sub",
                in: { $lt: [{ $size: "$$sub.v.arr" }, "$total"] }
              }
            }
          }
        }
      }
    }
  },
  // 筛选符合条件的文档
  {
    $match: { isMatch: true }
  },
  // 输出指定字段
  {
    $project: {
      _id: 0,
      title: 1
    }
  }
])

逻辑说明

  • 对于不存在total字段的文档,直接判定为符合要求
  • 对于存在total字段的文档:
    1. 用$objectToArray将container的动态键转换为[{k: "subContainer名", v: 对应值}]格式的数组
    2. 用$map遍历数组,计算每个subContainer下arr的长度与total的大小关系
    3. 用$anyElementTrue判断是否至少有一个arr长度小于total,只要存在就符合要求
  • 最终只保留title字段输出,与预期结果完全一致

内容的提问来源于stack exchange,提问作者rtritto

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 14:09:03