MongoDB使用$size统计嵌套数组,路径不存在时返回0而非报错
解决MongoDB $size操作符对缺失路径报错的问题
这个问题我之前也碰到过,MongoDB的$size确实对缺失路径很严格,不过有两个简单的方法可以让totalRevisions在路径不存在时返回0,而不是抛出异常:
方法一:使用$ifNull兜底为空数组
$ifNull操作符会检查第一个表达式的结果,如果是null或者路径缺失(missing),就返回第二个参数作为默认值。我们可以把默认值设为空数组,这样$size统计空数组就会返回0,完美避开报错。
修改后的代码如下:
totalRevisions: { $size: { $ifNull: [`$revisions.${entryId}.${languageId}`, []] } }
方法二:使用$cond判断类型后分支处理
如果想更明确地判断目标路径是否为数组,可以用$cond结合$type操作符:先检查目标路径的类型是不是数组,是就用$size统计,否则直接返回0。
代码示例:
totalRevisions: { $cond: { if: { $eq: [{ $type: `$revisions.${entryId}.${languageId}` }, 'array'] }, then: { $size: `$revisions.${entryId}.${languageId}` }, else: 0 } }
这两种方法都适配你提供的嵌套数据结构(project.revisions是对象,下一级是entryId,再下一级是languageId对应修订记录数组),无论目标路径是否存在,都能正常返回统计结果。
内容的提问来源于stack exchange,提问作者nanobar
相关产品推荐
相关产品推荐

