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

MongoDBの$addToSet演算子を使って単一フィールドの一意な値を取得する方法

MongoDBの $addToSet 演算子は、配列に値を追加するための更新演算子です。すでに配列内に同じ値が存在する場合は、重複を避けるために何も追加しません。この特性を活かすことで、集計パイプライン(aggregate)と組み合わせて、特定のフィールドから重複のない値の一覧を簡単に取得できます。

この記事では、サンプルコレクションを作成し、$addToSet を使って「ProjectName」フィールドの一意な値を取得する手順を解説します。

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

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

> db.demo533.insertOne({"ProjectName":"Online Hospital Management"});{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e8b4cfaef4dcbee04fbbbfc")
}
> db.demo533.insertOne({"ProjectName":"Online Library Management"});{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e8b4d02ef4dcbee04fbbbfd")
}
> db.demo533.insertOne({"ProjectName":"Online Hospital Management"});{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e8b4d04ef4dcbee04fbbbfe")
}
> db.demo533.insertOne({"ProjectName":"Online Customer Tracker"});{
    "acknowledged" : true,
    "insertedId" : ObjectId("5e8b4d0def4dcbee04fbbbff")
}

この例では、「Online Hospital Management」が意図的に重複して登録されている点に注目してください。

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

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

> db.demo533.find();

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

{ "_id" : ObjectId("5e8b4cfaef4dcbee04fbbbfc"), "ProjectName" : "Online Hospital Management" }
{ "_id" : ObjectId("5e8b4d02ef4dcbee04fbbbfd"), "ProjectName" : "Online Library Management" }
{ "_id" : ObjectId("5e8b4d04ef4dcbee04fbbbfe"), "ProjectName" : "Online Hospital Management" }
{ "_id" : ObjectId("5e8b4d0def4dcbee04fbbbff"), "ProjectName" : "Online Customer Tracker" }

4件のドキュメントが登録されており、そのうち2件が同じプロジェクト名を持っていることが確認できます。

3. $addToSetを使って一意な値を取得する

次に、aggregate() メソッドと $group ステージを組み合わせて、$addToSet を実装し、「ProjectName」フィールドの値を重複なく取得するクエリを紹介します。

> db.demo533.aggregate(
...     [
...        {
...           $group:
...           {
...              _id:null,
...              SetOfProject: { $addToSet: "$ProjectName" }
...           }
...        }
...     ]
... )

クエリのポイント

ここでのポイントは以下の通りです。

_id: null を指定することで、すべてのドキュメントを1つのグループにまとめています。$addToSet: "$ProjectName" により、各ドキュメントの「ProjectName」フィールドの値が配列に追加されますが、重複する値は自動的に除外されます。

4. 実行結果

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

{ "_id" : null, "SetOfProject" : [ "Online Customer Tracker", "Online Library Management", "Online Hospital Management" ] }

結果を見ると、重複していた「Online Hospital Management」が1つだけ含まれ、3つの一意なプロジェクト名が配列として返されていることがわかります。

まとめ

$addToSet は、配列フィールドへの重複なしの追加だけでなく、$group ステージ内で使うことで、特定フィールドの一意な値のリストを取得するのにも非常に便利な演算子です。SQLにおける SELECT DISTINCT に近い動作を実現したい場合に、ぜひ活用してみてください。

  1. MongoDBの集約(Aggregation)で特定のフィールド値を持つドキュメントを取得する方法

    特定の条件に一致するドキュメントを取得したい場合には、aggregate() メソッドを使用します。ここでは、フィールド「Age」の値が「21」であるドキュメントを取得するケースを例に解説します。 サンプルコレクションの作成 まずは、ドキュメントを含むコレクションを作成しましょう。 > db.demo685.insertOne( ... { ... details: ... [ ... { ... Name:Chris, ... Age:21 ... }, ..

  2. MongoDBでフィールドの戻り値を制限するクエリの書き方($slice演算子の使い方)

    MongoDBでフィールドの戻り値を制限するクエリの書き方MongoDBで配列フィールドの要素数を制限して取得したい場合は、$slice演算子を使用します。この演算子を活用することで、クエリ結果として返す配列の要素数を柔軟にコントロールできます。ここでは、具体的な手順をサンプルコードとともに解説します。1. コレクションとドキュメントの作成まず、insertOne()メソッドを使ってドキュメントを挿入し、コレクションを作成します。> db.demo594.insertOne(...    {...    &n