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

【MongoDB】ロールに基づいて「名前」フィールドのみを取得するaggregate()クエリの実装方法

ロールに基づいて「Name」フィールドのみを抽出するには

MongoDBで特定のロール(Admin・Guest・Userなど)の条件に基づいて「Name」フィールドのみを取得したい場合は、aggregate()メソッドを使用します。この記事では、3つのロール(Admin、Guest、User)を持つサンプルデータを用いて、その具体的な手順を解説します。

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

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

> db.demo532.insertOne({"Name":"Chris","Type":"Admin"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e8b4a9def4dcbee04fbbbf9")
}
> db.demo532.insertOne({"Name":"David","Type":"Guest"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e8b4aa3ef4dcbee04fbbbfa")
}
> db.demo532.insertOne({"Name":"Bob","Type":"User"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e8b4ab0ef4dcbee04fbbbfb")
}

2. 登録されたドキュメントの確認

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

> db.demo532.find();

実行すると、次のような出力が得られます。

{ "_id" : ObjectId("5e8b4a9def4dcbee04fbbbf9"), "Name" : "Chris", "Type" : "Admin" }
{ "_id" : ObjectId("5e8b4aa3ef4dcbee04fbbbfa"), "Name" : "David", "Type" : "Guest" }
{ "_id" : ObjectId("5e8b4ab0ef4dcbee04fbbbfb"), "Name" : "Bob", "Type" : "User" }

3. ロールに基づいて「Name」のみをフェッチする集計クエリ

以下のクエリでは、集計パイプラインを組み合わせることで、「Admin」ロールを持たないユーザーの「Name」フィールドだけを抽出しています。同一コレクション内の他のドキュメントと比較しながら、一意なドキュメントを取得する仕組みです。

> db.demo532.aggregate([
...    {$group: {_id:"$Name", "types":{$addToSet:"$Type"}}},
...    {$project: {_id:1, "types": 1, "isSubset": { $setIsSubset: [ ["Admin"], "$types" ] }}},
...    {$match: {"isSubset": false}},
...    {$group: {_id:"$isSubset", "Name": {$push : "$_id"}}},
...    {$project: {"_id": 0, "Name": 1}},
...    {$unwind: "$Name"}
... ])

パイプラインの各ステージの役割

  • $group:名前ごとにグループ化し、$addToSetで重複のないロール一覧を作成します。
  • $project + $setIsSubset:各ユーザーのロール配列に「Admin」が含まれているかどうかを判定し、isSubsetフラグとして保持します。
  • $matchisSubsetfalse(Admin以外のロール)のドキュメントだけを残します。
  • $unwind:配列化された名前を個別のドキュメントに展開し、最終的に「Name」フィールドのみを出力します。

4. 実行結果

上記のクエリを実行すると、Adminロールを持たないユーザーの「Name」フィールドのみが出力されます。

{ "Name" : "David" }
{ "Name" : "Bob" }

このように、aggregate()のパイプラインを活用すれば、複雑な条件でのデータ抽出も柔軟に実現できます。特に$setIsSubsetは配列の包含判定に便利な演算子なので、ロールや権限管理のシーンでぜひ活用してみてください。

  1. MongoDBでフィールド値に含まれる「@email」のような文字列を検索する方法

    MongoDBのfind()メソッドを使えば、正規表現(Regex)を活用して、フィールド値の中から特定の文字列を柔軟に検索できます。本記事では、「@email」という文字列を含むドキュメントを検索する方法を、実際のコード例とともに解説します。1. 検索用コレクションの作成まずは、メールアドレスを格納したドキュメントを持つコレクションを作成しましょう。> db.demo727.insertOne({UserId:John@email.com}); { acknowledged : true, insertedId : ObjectId(5eab375f4341781127

  2. 【MySQL】別のフィールドのブール値に基づいて特定のフィールドのみを取得するクエリの書き方

    はじめに MySQLでは、あるカラム(フィールド)に格納されたブール値(TRUE/FALSE)を条件として、別のカラムの値だけを抽出したいケースがよくあります。本記事では、isMarriedのようなブール型カラムを条件に、従業員名だけを取得する方法を、テーブル作成から順を追って具体例とともに解説します。 サンプルテーブルの作成 まず、デモ用のテーブルを作成します。 mysql> create table DemoTable (    EmployeeId int NOT NULL AUTO_INCREMENT PRIMARY KEY,    Em