MongoDB
 Computer >> コンピューター >  >> プログラミング >> MongoDB

MongoDBのアグリゲーションで$redact演算子を使う方法

$redact演算子とは

MongoDBの$redactステージは、ドキュメント自体に格納されている情報に基づいて、各ドキュメントの内容を制限(フィルタリング)するための機能です。アグリゲーションフレームワークでは、$cond演算子を$redactと組み合わせることで、条件に応じてドキュメントを保持($$KEEP)するか除外($$PRUNE)するかを柔軟に制御できます。

ここでは、実際のコード例を通して、$redactの基本的な使い方を見ていきましょう。

サンプルコレクションの作成

まず、insertOne()メソッドを使って、複数のドキュメントを含むコレクションを作成します。

> db.demo546.insertOne({"Value1":10,"Value2":20});{
    "acknowledged" : true, "insertedId" : ObjectId("5e8e263f9e5f92834d7f05d7")
}
> db.demo546.insertOne({"Value1":40,"Value2":30,Value3:50});{
    "acknowledged" : true, "insertedId" : ObjectId("5e8e26549e5f92834d7f05d8")
}
> db.demo546.insertOne({"Value1":100,"Value2":200,Value3:null});{
    "acknowledged" : true, "insertedId" : ObjectId("5e8e26619e5f92834d7f05d9")
}
> db.demo546.insertOne({"Value1":400,"Value2":1000,Value3:null});{
    "acknowledged" : true, "insertedId" : ObjectId("5e8e26e09e5f92834d7f05da")
}
> db.demo546.insertOne({"Value1":400,"Value2":200,Value3:null});{
    "acknowledged" : true, "insertedId" : ObjectId("5e8e26f59e5f92834d7f05db")
}
> db.demo546.insertOne({"Value1":400,"Value2":1000,Value3:60});{
    "acknowledged" : true, "insertedId" : ObjectId("5e8e27159e5f92834d7f05dc")
}

コレクション内の全ドキュメントを表示

find()メソッドを使うと、コレクション内のすべてのドキュメントを確認できます。

> db.demo546.find();

上記のクエリを実行すると、次のような出力が得られます。

{ "_id" : ObjectId("5e8e263f9e5f92834d7f05d7"), "Value1" : 10, "Value2" : 20 }
{ "_id" : ObjectId("5e8e26549e5f92834d7f05d8"), "Value1" : 40, "Value2" : 30, "Value3" : 50 }
{ "_id" : ObjectId("5e8e26619e5f92834d7f05d9"), "Value1" : 100, "Value2" : 200, "Value3" : null }
{ "_id" : ObjectId("5e8e26e09e5f92834d7f05da"), "Value1" : 400, "Value2" : 1000, "Value3" : null }
{ "_id" : ObjectId("5e8e26f59e5f92834d7f05db"), "Value1" : 400, "Value2" : 200, "Value3" : null }
{ "_id" : ObjectId("5e8e27159e5f92834d7f05dc"), "Value1" : 400, "Value2" : 1000, "Value3" : 60 }

$redactと$condを組み合わせたアグリゲーションクエリ

続いて、アグリゲーションで$redactを使用してドキュメントをフィルタリングするクエリを見てみましょう。以下の例では、$ltで「Value1がValue2より小さい」ことを判定し、さらに$ifNullでValue3フィールドがnullでないことをチェックしています。両方の条件を満たすドキュメントだけが保持され、それ以外は除外されます。

> db.demo546.aggregate( { "$redact": { "$cond": { "if": { "$and": [ {
    "$lt": [ "$Value1", "$Value2" ] }, { "$ifNull": [ "$Value3", false ] } ] },
    "then": "$$KEEP", "else": "$$PRUNE" } }
} );

このクエリを実行すると、条件を満たすのは最後の1件のみのため、次のような出力になります。

{ "_id" : ObjectId("5e8e27159e5f92834d7f05dc"), "Value1" : 400, "Value2" : 1000, "Value3" : 60 }

ポイントまとめ

・$redactは、ドキュメント自身の値に基づいてアクセス制御やフィルタリングを行いたい場合に便利です。
・$condの「if / then / else」構造により、条件分岐ロジックをパイプライン内に直接記述できます。
・フィールドの存在チェックには$ifNullが有効で、nullや未定義の扱いを明確に制御できます。
・条件を満たす場合は$$KEEP、除外したい場合は$$PRUNEを返します。

  1. MongoDBのupdateOne()とinsertOne()の違いと使い方を実例で解説

    MongoDBには、コレクションへのドキュメント追加や更新を行うための便利なメソッドが多数用意されています。本記事では、その中でも特によく使われる insertOne() と updateOne() の役割の違いと具体的な使い方を、実際のコード例とともにわかりやすく解説します。insertOne():コレクションに新しいドキュメントを1件挿入するメソッドです。updateOne():クエリフィルタ(検索条件)に一致したドキュメントのうち、最初の1件のみを更新するメソッドです。insertOne()でサンプルコレクションを作成するまずは insertOne() を使って、サンプル用のコレクション

  2. MongoDBのaggregateで$groupを使って複数の集計結果を一度に取得する方法

    MongoDBでは、$facetと$groupを組み合わせることで、1回のaggregateクエリで複数の集計結果を同時に取得できます。この記事では、実際のコード例を通じてその方法を解説します。サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成しましょう。以下のようにinsertOne()メソッドを使ってデータを挿入します。> db.demo765.insertOne( ... { ... Name:John, ... Category:ComputerScience, ... SubjectName:MongoDB,