MongoDB聚合查询如何筛选含/不含like为true的有效点赞文档
实现方案
你原来的逻辑只判断了likes数组的长度,没有校验数组内元素的like字段值,才会出现取消点赞后查询结果错误的问题。可以通过MongoDB的数组查询能力修改逻辑如下:
核心查询逻辑
我们可以用$elemMatch直接匹配数组内是否存在符合条件的元素,写法简单易读:
if (searchOptions.withLikes === true) { // 查询有有效点赞的文档:存在至少1个like为true的元素 matchQueryConditions.$and.push({ likes: { $elemMatch: { like: true } } }) } else { // 查询无有效点赞的文档:要么数组为空,要么所有元素like都为false matchQueryConditions.$and.push({ $or: [ { likes: { $size: 0 } }, { likes: { $not: { $elemMatch: { like: true } } } } ] }) }
如果你想保持原来用$expr的拼接风格,也可以改成如下等价写法:
matchQueryConditions.$and.push({ $expr: { $eq: [ { $anyElementTrue: { $map: { input: '$likes', in: '$$this.like' } } }, searchOptions.withLikes === true ] } })
逻辑验证
用你给出的示例数据测试,两种写法都会返回符合预期的结果:
withLikes=true时返回C、E、FwithLikes=false时返回A、B、D
内容的提问来源于stack exchange,提问作者joe92
相关产品推荐
相关产品推荐

