フィールド レベル リダクションを実装する
項目一覧
$redact
パイプライン演算子は、ドキュメント自体に保存されている情報に基づいてドキュメントの内容を制限します。
アクセス条件データを保存するには、 ドキュメントと 埋め込みドキュメントに フィールドを追加します。 同じデータに対してアクセス レベルの複数の組み合わせを可能にするには、アクセス フィールドを配列の配列に設定することを検討してください。 各配列要素には、そのセットを持つユーザーがデータにアクセスできるようにする必須セットが含まれています。
次に、データの表示に必要なアクセスに基づいて結果セットの内容を制限するために、 操作に$redact
db.collection.aggregate()
ステージを含めます。
構文や関連するシステム変数、その他の例など、 $redact
パイプライン演算子の詳細については、 $redact
を参照してください。
手順
たとえば、 forecasts
コレクションには次の形式のドキュメントが含まれており、 tags
フィールドによってデータの表示に必要なアクセスレベルが決定されます。
{ _id: 1, title: "123 Department Report", tags: [ [ "G" ], [ "FDW" ] ], year: 2014, subsections: [ { subtitle: "Section 1: Overview", tags: [ [ "SI", "G" ], [ "FDW" ] ], content: "Section 1: This is the content of section 1." }, { subtitle: "Section 2: Analysis", tags: [ [ "STLW" ] ], content: "Section 2: This is the content of section 2." }, { subtitle: "Section 3: Budgeting", tags: [ [ "TK" ], [ "FDW", "TGE" ] ], content: { text: "Section 3: This is the content of section3.", tags: [ [ "HCS"], [ "FDW", "TGE", "BX" ] ] } } ] }
各ドキュメントごとに、 tags
フィールドには、データを表示するために必要なさまざまなアクセス グループが含まれています。 たとえば、値[ [ "G" ], [
"FDW", "TGE" ] ]
は、ユーザーがデータを表示するためにアクセスレベル["G"]
または[ "FDW", "TGE" ]
の両方が必要であることを指定できます。
"FDW"
または"TGE"
のいずれかでタグ付けされた情報を表示するアクセス権を持つユーザーを考えてみましょう。 このユーザーの年が2014
であるすべてのドキュメントに対してクエリを実行するには、次のように$redact
ステージを含めます。
var userAccess = [ "FDW", "TGE" ]; db.forecasts.aggregate( [ { $match: { year: 2014 } }, { $redact: { $cond: { if: { $anyElementTrue: { $map: { input: "$tags" , as: "fieldTag", in: { $setIsSubset: [ "$$fieldTag", userAccess ] } } } }, then: "$$DESCEND", else: "$$PRUNE" } } } ] )
集約操作により、ユーザーには次の「編集済み」ドキュメントが返されます。
{ "_id" : 1, "title" : "123 Department Report", "tags" : [ [ "G" ], [ "FDW" ] ], "year" : 2014, "subsections" : [ { "subtitle" : "Section 1: Overview", "tags" : [ [ "SI", "G" ], [ "FDW" ] ], "content" : "Section 1: This is the content of section 1." }, { "subtitle" : "Section 3: Budgeting", "tags" : [ [ "TK" ], [ "FDW", "TGE" ] ] } ] }