如何统计数组字段不含指定键值且包含null值的总行数
统计数组类型字段符合条件行数的实现方案
核心统计规则:
- 字段值为
null的行直接纳入符合条件的计数 - 字段为数组类型时,数组内所有元素的
name键值都不等于'test'的行纳入计数 - 数组中只要存在任意一个元素的
name值为'test',该行就排除
MongoDB 查询实现
直接使用$not搭配$elemMatch操作符编写统计查询即可,该写法天然兼容null值的匹配逻辑,不需要额外单独添加null值判断条件:
db.目标集合名.countDocuments({ names: { $not: { $elemMatch: { name: "test" } } } })
逻辑说明:$elemMatch的作用是匹配数组中至少一个元素满足指定条件,外层包裹$not即对匹配结果取反,筛选出找不到任何数组元素满足name等于test的记录,覆盖两类符合要求的场景:一是字段值为null、不存在可遍历的数组结构;二是数组内所有元素的name值都不等于test,完全匹配统计规则。
原生JavaScript 本地统计
如果是已经拉取到完整结构化数据,在前端/Node.js环境做本地统计,可以参考如下写法:
// 假设rawList为查询到的所有行数据组成的数组 const validCount = rawList.filter(row => { if (row.names === null) return true return !row.names.some(item => item.name === 'test') }).length
结果验证
对照提供的测试数据逐一校验匹配规则:
| names | 是否计入统计 | 说明 |
|---|---|---|
| null | 是 | 字段值为null符合规则 |
| null | 是 | 字段值为null符合规则 |
| [{name:'test'},{name:'test1'}] | 否 | 存在name为test的数组元素 |
| [{name:'test'},{name:'test1'}] | 否 | 存在name为test的数组元素 |
| [{name:'test1'},{name:'test2'}] | 是 | 数组内无name为test的元素 |
最终统计结果为3,和预期结果完全一致。
内容的提问来源于stack exchange,提问作者Darshan Sachaniya
相关产品推荐
相关产品推荐

