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

MongoDBで配列フィールドの重複しない値(distinct)を取得する方法

配列フィールドのdistinct集計とは

MongoDBでは、distinct()メソッドを使うことで、コレクション内の特定フィールドから重複を除いた値の一覧を簡単に取得できます。配列フィールドに対して実行した場合、各ドキュメントの配列要素がすべて展開され、全体からユニークな値だけが抽出されます。

ここでは、実際にサンプルコレクションを作成し、配列フィールドに対するdistinct集計の使い方を順を追って解説します。

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

まず、いくつかのドキュメントを含むコレクションを作成しましょう。以下はinsertOne()メソッドを使用してドキュメントを挿入するクエリです。

> db.distinctAggregation.insertOne({"UserName":"Larry","UserPost":["Hi","Hello"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c98aefb330fd0aa0d2fe4c6")
}
> db.distinctAggregation.insertOne({"UserName":"Chris","UserPost":["Hi","Good Morning"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c98af0a330fd0aa0d2fe4c7")
}
> db.distinctAggregation.insertOne({"UserName":"Robert","UserPost":["Awesome"]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c98af1e330fd0aa0d2fe4c8")
}

3人のユーザーがそれぞれ異なる投稿内容を持つドキュメントが登録されました。次に、find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみます。

> db.distinctAggregation.find().pretty();

このクエリを実行すると、以下のような出力が得られます。

{
   "_id" : ObjectId("5c98aefb330fd0aa0d2fe4c6"),
   "UserName" : "Larry",
   "UserPost" : [
      "Hi",
      "Hello"
   ]
}
{
   "_id" : ObjectId("5c98af0a330fd0aa0d2fe4c7"),
   "UserName" : "Chris",
   "UserPost" : [
      "Hi",
      "Good Morning"
   ]
}
{
   "_id" : ObjectId("5c98af1e330fd0aa0d2fe4c8"),
   "UserName" : "Robert",
   "UserPost" : [
      "Awesome"
   ]
}

配列フィールドへのインデックス作成

検索パフォーマンスを向上させるために、配列フィールド「UserPost」にインデックスを作成します。以下のようにensureIndex()メソッドを使用します。

> db.distinctAggregation.ensureIndex({"UserPost":1});
{
   "createdCollectionAutomatically" : false,
   "numIndexesBefore" : 1,
   "numIndexesAfter" : 2,
   "ok" : 1
}

出力結果を見ると、インデックス数が1から2に増えており、インデックスが正常に作成されたことがわかります。なお、新しいバージョンのMongoDBではcreateIndex()メソッドが推奨されています。

distinct()でユニークな値を取得する

準備が整ったので、distinct()メソッドを使って、配列フィールド「UserPost」から重複しない値をすべて取得します。

> db.distinctAggregation.distinct("UserPost");

実行すると、以下のような結果が出力されます。

[ "Awesome", "Good Morning", "Hello", "Hi" ]

結果のポイント

注目すべきは、「Hi」という値がLarryとChris両方のドキュメントに含まれていたにもかかわらず、結果には1回しか表示されていないという点です。distinct()メソッドは、配列フィールドの全要素を横断的に走査し、自動的に重複を排除してくれるため、複数ドキュメントにまたがるユニークな値の一覧を簡単に取得できます。

このように、MongoDBのdistinct()メソッドを活用すれば、配列フィールドに含まれる値の種類を効率的に把握でき、タグやカテゴリの一覧抽出など、さまざまな場面で役立ちます。

  1. MongoDBで配列要素の平均値を取得するクエリの書き方

    MongoDBで配列内の数値の平均を求める方法MongoDBでは、配列に格納された複数の数値から平均値を算出したいケースがよくあります。例えば、1つのドキュメントの中に複数の点数(Marks)が配列として保存されている場合、その平均点を取得したいことがあります。このような場合、集計パイプライン(aggregation)と$avg演算子を組み合わせることで、簡単に平均値を求めることができます。$avgは、指定したフィールド(配列の場合はその全要素)の数値の平均を自動的に計算してくれる便利な演算子です。以下、具体的な手順を見ていきましょう。1. コレクションを作成し、ドキュメントを挿入するまず、i

  2. C++で配列内のユニークな要素数をカウントする方法

    本記事では、重複する要素を含むソートされていない配列が与えられたとき、その配列に含まれるユニークな(重複しない)要素の個数を求める方法を解説します。 配列とは、同じ型の要素を固定サイズで連続的に格納できるデータ構造の一種です。複数のデータをまとめて管理できるだけでなく、同じ型の変数の集合として捉えると、その利便性がより理解しやすくなります。 具体例 入力: int arr[] = {1, 1, 2, 3, 3, 4, 4} 出力: count is 4 説明: この配列には「1、2、3、4」の4種類のユニークな要素が含まれています。配列のサイズは7ですが、これは重複した要素が含まれているためで