Mongoose查询二维嵌套数组长度大于指定值的文档方法求助
错误原因
MongoDB 的 $size 运算符仅支持匹配精确的数组长度值,无法直接与 $gt/$lt 等比较运算符组合使用,因此你之前的写法无法生效。
推荐实现方案(MongoDB 3.6+ 支持)
使用 $expr 配合数组遍历逻辑实现查询,写法如下:
CallerTraces.find({ $expr: { $anyElementTrue: { $map: { input: "$traces", in: { $gt: [ { $size: "$$this" }, minTraceSize ] } } } } })
逻辑说明:
$map遍历traces字段下的每一个嵌套子数组,逐个计算子数组长度是否大于minTraceSize,返回布尔值组成的数组$anyElementTrue判断上述布尔值数组中是否存在至少一个true,存在则判定当前文档符合查询条件
兼容低版本MongoDB的聚合方案
如果你的MongoDB版本低于3.6,可以使用聚合管道实现相同需求:
CallerTraces.aggregate([ // 新增匹配标记字段 { $addFields: { hasQualifiedTrace: { $anyElementTrue: { $map: { input: "$traces", in: { $gt: [ { $size: "$$this" }, minTraceSize ] } } } } } }, // 过滤符合条件的文档 { $match: { hasQualifiedTrace: true } }, // 移除新增的标记字段,返回原始文档结构 { $project: { hasQualifiedTrace: 0 } } ])
性能优化提示
如果数据量较大且这类查询频率很高,建议在写入文档时冗余存储每个嵌套子数组的长度字段,查询时可以直接匹配冗余字段,大幅提升查询效率。
内容的提问来源于stack exchange,提问作者Bruno Medeiros
相关产品推荐
相关产品推荐

