MongoDB聚合计算用户多角色权限的按位运算值
解决方案
原聚合查询存在两处问题:
$lookup的localField配置错误,你的users集合中存储角色ID的字段是ranks,而非rank- 仅通过
$arrayElemAt取第一个角色的权限值,未实现多角色权限的按位合并
以下是修正后的聚合查询代码:
const users = await this.collection.aggregate([ { $match: { userID: '123' } }, { $limit: 1 }, { $lookup: { from: 'ranks', localField: 'ranks', // 匹配users集合中的角色ID数组字段 foreignField: '_id', as: 'rankDetails' // 用独立字段存储关联的角色详情,避免覆盖原ranks字段 } }, { $set: { // 使用$reduce遍历所有角色权限,通过$bitOr实现按位合并 permissions: { $reduce: { input: '$rankDetails.permissions', initialValue: 0, in: { $bitOr: ['$$value', '$$this'] } } } } }, // 可选:移除临时的角色详情字段,仅保留原数据和合并后的权限 { $unset: 'rankDetails' } ]).toArray();
关键逻辑说明
- 关联角色数据:通过
$lookup将用户的ranks数组与ranks集合的_id关联,得到所有角色的完整权限数据,存入rankDetails字段 - 按位合并权限:利用
$reduce迭代rankDetails.permissions数组,从初始值0开始,每次将当前值与迭代到的权限值执行按位或($bitOr)运算,最终得到合并后的总权限 - 清理临时字段:通过
$unset移除rankDetails,输出结构与期望一致
执行后将得到目标输出:
{ "_id": "1234", "ranks":[ "xxxx", "xxxxxxxxx" ], "permissions":3 }
内容的提问来源于stack exchange,提问作者user12869402
相关产品推荐
相关产品推荐

