MongoDB查询适配:likes集合用户存储改为数组后的互赞查询修改
适配MongoDB users数组结构的互赞用户聚合查询
直接上修改后的聚合查询代码:
.collection('likes') .aggregate([ // 匹配包含目标用户且点赞状态为true的文档 {$match: {users: userId, like: true}}, // 分组收集所有发起点赞的用户(users数组第一个元素)和被点赞的用户(第二个元素) {$group: { _id: 0, from: {$addToSet: {$arrayElemAt: ["$users", 0]}}, to: {$addToSet: {$arrayElemAt: ["$users", 1]}}, } }, // 取交集并过滤掉当前用户,得到最终互赞用户列表 {$project: { _id: 0, users: { $filter: { input: {$setIntersection: ["$from", "$to"]}, cond: {$ne: ["$$this", userId]} } } } } ])
关键修改点说明:
- $match阶段:不再用
$or分别匹配原from/to字段,直接通过users: userId匹配数组中包含目标用户的文档,MongoDB会自动识别数组包含指定值的情况,逻辑更简洁。 - $group阶段:用
$arrayElemAt从users数组中分别提取原from(索引0)和原to(索引1)的用户ID,再用$addToSet收集去重后的列表,和原查询的分组逻辑完全对齐。 - $project阶段:和原查询完全一致,因为分组后的from和to集合含义没变,直接取交集再过滤掉当前用户即可得到互赞用户列表。
内容的提问来源于stack exchange,提问作者Kal
相关产品推荐
相关产品推荐

