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字段的文档:- 用
$objectToArray将container的动态键转换为[{k: "subContainer名", v: 对应值}]格式的数组 - 用
$map遍历数组,计算每个subContainer下arr的长度与total的大小关系 - 用
$anyElementTrue判断是否至少有一个arr长度小于total,只要存在就符合要求
- 用
- 最终只保留
title字段输出,与预期结果完全一致
内容的提问来源于stack exchange,提问作者rtritto
相关产品推荐
相关产品推荐

