MongoDB使用$size运算符时能否添加子文档匹配条件?
错误原因
$size运算符仅支持传入数组类型参数,直接返回数组的总元素数,不支持内嵌筛选条件过滤数组元素。你尝试在$size参数中为$likes指定匹配条件的写法不符合MongoDB聚合表达式语法,因此触发报错。
正确实现方案
你可以先通过$filter运算符筛选出likes数组中like为true的元素,再用$size统计筛选后数组的长度即可,写法如下:
'$set': { 'likeCount': { $size: { $filter: { input: '$likes', cond: { $eq: ['$$this.like', true] } } } } }
参数说明
input:指定要遍历筛选的数组,这里对应文档的likes字段cond:定义数组元素的匹配规则,其中$$this指代遍历过程中当前的子文档,当前规则为子文档的like字段值等于true- 筛选完成后会生成仅包含符合条件元素的新数组,
$size统计该数组长度即可得到符合要求的元素数量
兼容写法(可选)
如果你使用的是MongoDB 3.2+版本,也可以通过$sum结合条件判断实现同等效果:
'$set': { 'likeCount': { $sum: { $map: { input: '$likes', in: { $cond: [{ $eq: ['$$this.like', true] }, 1, 0] } } } } }
内容的提问来源于stack exchange,提问作者user1037355
相关产品推荐
相关产品推荐

