如何编写MongoDB查询实现角色数据的权限与多条件过滤?
MongoDB Characters 集合过滤实现方案
核心过滤逻辑
要实现用户仅能查看自身创建角色及API导入角色的需求,需先构建权限过滤条件,再叠加名称、职业的筛选条件:
1. 权限过滤规则
需满足以下任一条件:
- 角色为API导入:文档包含
api: true(或userId: { $exists: false },可根据业务实际选择,示例中API导入角色带有api:true标记) - 角色为当前用户创建:文档的
userId字段等于当前登录用户的ID
2. 筛选条件支持
- 按角色名称筛选:用正则表达式实现不区分大小写的模糊匹配
- 按职业筛选:匹配
profession数组中职业对象的name字段,支持单个或多个职业匹配
完整查询示例
假设当前用户ID为 "62d836c636bd5ad391b4f7b9",需筛选名称包含"ar"且职业包含"carpenter"的角色,MongoDB查询语句如下:
const currentUserId = "62d836c636bd5ad391b4f7b9"; const searchName = "ar"; const targetProfessions = ["carpenter"]; const query = { $and: [ // 权限过滤条件 { $or: [ { api: true }, { userId: currentUserId } ] }, // 名称筛选(无需时可移除) { name: { $regex: searchName, $options: "i" } }, // 职业筛选(无需时可移除) { "profession.name": { $in: targetProfessions } } ] }; // 执行查询 db.Characters.find(query);
文档结构参考
API导入的角色示例
{ "_id" : ObjectId("62d836fd459afd6d0fdd7d1c"), "name" : "Robert", "api" : true, "height" : 157, "weight" : 69, "profession" : [ { "_id" : ObjectId("62d836c736bd5ad391b4f7c6"), "name" : "carpenter", "api" : true }, { "_id" : ObjectId("62d836c736bd5ad391b4f7be"), "name" : "professor", "api" : true } ] }
用户创建的角色示例
{ "_id" : ObjectId("62d836fd459afd6d0fdd7d1d"), "name" : "Martin", "height" : 177, "weight" : 79, "profession" : [ { "_id" : ObjectId("62d836c736bd5ad391b4f7c6"), "name" : "carpenter", "api" : true }, { "_id" : ObjectId("62d836c736bd5ad391b4f7be"), "name" : "barber", "api" : true } ], "userId" : "62d836c636bd5ad391b4f7b9" }
注意事项
- 若业务中API导入角色仅以
userId不存在作为标记,可将{ api: true }替换为{ userId: { $exists: false } } - 正则表达式匹配名称时,若需优化性能,可针对
name字段创建文本索引 - 职业筛选若支持模糊匹配,可将
$in替换为$regex,例如:{ "profession.name": { $regex: "carp", $options: "i" } }
内容的提问来源于stack exchange,提问作者vazquezdev
相关产品推荐
相关产品推荐

