$redact(权限过滤)
最后更新:2026-10-09
$redact(权限过滤)
$redact 按文档每层级的权限元数据决定保留、排除还是继续深入,实现行级与字段级过滤。它与 $$KEEP、$$PRUNE、$$DESCEND 三个系统变量配合:$$DESCEND 进入内嵌文档继续判断,$$PRUNE 丢弃该文档及其子树,$$KEEP 保留当前文档。注意它只是查询侧过滤,不是安全边界。
| 分类 | 高级与诊断 |
|---|---|
| MongoDB 版本 | 1.0+ |
| 示例语言 | mongosh (Shell) |
📝 语法
{ $redact: { $cond: { if: { $eq: [ "$level", "用户级别" ] }, then: "$$PRUNE", else: "$$DESCEND" } } }
⚙️ 参数
| 条件表达式 | 在每个嵌套层级求值的表达式,返回 $$KEEP、$$PRUNE 或 $$DESCEND。 |
|---|
返回值:按权限裁剪后的文档流
▶ 示例
请在本地安装的 mongosh 中执行以下命令(需已启动 mongod):
// $redact:只保留 access 为 public 的内容
db.employees.aggregate([
{ $redact: {
$cond: { if: { $eq: ['$access', 'public'] }, then: '$$KEEP', else: '$$DESCEND' }
} }
])
运行结果:
// 非 public 的文档或字段被移除
📌 注意事项
- 只支持 $$KEEP、$$PRUNE、$$DESCEND 三个系统变量
- 判断在文档的每个嵌套层级上递归执行
- 与 $project 不同,$redact 是递归的层级过滤
🏷️ 相关标签
💡 相关案例
更多实战案例即将上线,敬请期待。
📚 相关教程
❓ 常见问题
Q$$DESCEND 什么时候用?
A当前文档允许但需要继续检查内嵌文档时使用,决定权下放到子层级。
Q$redact 能替代权限系统吗?
A它能做文档级过滤,但不是安全边界,客户端仍可直接查询集合。
Q$redact 与 $match 有什么区别?
A$match 按顶层条件过滤整条文档;$redact 按层级递归决定每层去留。