$redact (伏せ字化)
最終更新:2026-10-09
$redact (伏せ字化)
$redact は、ドキュメントに埋め込まれた権限メタデータを使ってフィールドレベルでフィルターし、システム変数の $$KEEP、$$PRUNE、$$DESCEND を使います。$$DESCEND は埋め込みドキュメントに降りていき、$$PRUNE はドキュメントとそのサブツリーを落とし、$$KEEP は保持します。クエリ側のフィルタリングであり、セキュリティの境界ではありません。
| カテゴリ | 高度と診断 |
|---|---|
| MongoDB バージョン | 1.0+ |
| 例の言語 | mongosh(シェル) |
📝 構文
{ $redact: { $cond: { if: { $eq: [ "$level", "userLevel" ] }, then: "$$PRUNE", else: "$$DESCEND" } } }
⚙️ パラメータ
| 条件式 | 各ネストレベルで評価される式。$$KEEP、$$PRUNE、または $$DESCEND を返します。 |
|---|
戻り値:アクセスルールで絞り込まれたドキュメントストリーム
▶ 例
以下のコマンドをローカルの mongosh で実行してください(mongod が起動済みである必要があります):
// $redact: 公開コンテンツだけを保持
db.employees.aggregate([
{ $redact: {
$cond: { if: { $eq: ['$access', 'public'] }, then: '$$KEEP', else: '$$DESCEND' }
} }
])
出力:
// 公開でないドキュメントやフィールドが除去される
📌 注意事項
- 有効な結果は $$KEEP、$$PRUNE、$$DESCEND のみ
- 評価はすべてのネストレベルを再帰的に降りていく
- $project と違い、$redact はレベルごとに再帰的にフィルターする
🏷️ 関連タグ
💡 関連ケース
さらなる実践ケースを近日公開予定。
📚 関連チュートリアル
❓ よくある質問
Q$$DESCEND はいつ使いますか?
A現在のドキュメントは通すが、埋め込みドキュメントはまだ確認が必要なときです。判定を下位に委ねます。
Q$redact はアクセス制御システムの代わりになりますか?
Aクエリ時にフィルターしますが、セキュリティの境界ではありません。クライアントはコレクションを直接クエリできます。
Q$redact と $match の違いは?
A$match はトップレベルの条件でドキュメント全体をフィルターします。$redact はネストレベルごとに再帰的に判定します。