You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 10:48:18