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

MongoDBで配列フィールドの異なるレベル(ユニークな配列)を取得する方法

MongoDBで配列フィールドの異なるレベル(重複を排除した配列のリスト)を取得するには、集計フレームワークの $addToSet 演算子を使用します。$addToSetは、指定したフィールドの値を配列に追加する際に重複を自動的に排除してくれるため、ユニークな値のセットを作成するのに最適です。

ここでは、実際にコレクションを作成し、配列フィールドから異なるレベルを取得する手順を順番に見ていきましょう。

コレクションの作成とドキュメントの挿入

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

> db.demo122.insertOne({"ListOfValues":[100,10]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e2f20f1140daf4c2a3544b6")
}
> db.demo122.insertOne({"ListOfValues":[240,10]});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5e2f20f7140daf4c2a3544b7")
}

上記のクエリでは、「demo122」というコレクションに2つのドキュメントを挿入しています。各ドキュメントは「ListOfValues」という配列フィールドを持っています。

挿入したドキュメントの確認

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

> db.demo122.find();

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

{ "_id" : ObjectId("5e2f20f1140daf4c2a3544b6"), "ListOfValues" : [ 100, 10 ] }
{ "_id" : ObjectId("5e2f20f7140daf4c2a3544b7"), "ListOfValues" : [ 240, 10 ] }

$addToSetを使って配列フィールドの異なるレベルを取得する

MongoDBで配列フィールドの異なるレベルを取得するには、aggregate()メソッドと$groupステージを組み合わせます。$groupの「_id」を0に設定することで、すべてのドキュメントを単一のグループにまとめ、$addToSetで配列の重複を排除します。

> db.demo122.aggregate([
...    {
...       "$group": {
...          "_id": 0,
...          "ListOfValues": { "$addToSet": "$ListOfValues" }
...       }
...    }
... ])

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

{ "_id" : 0, "ListOfValues" : [ [ 240, 10 ], [ 100, 10 ] ] }

クエリの仕組み

この集計パイプラインの動作を簡単に解説します。

$groupステージ: 「_id: 0」を指定することで、コレクション内のすべてのドキュメントが1つのグループにまとめられます。

$addToSet演算子: 各ドキュメントの「ListOfValues」配列全体を1つの要素として新しい配列に追加します。このとき、完全に同じ配列が存在する場合は重複として除外されます。

その結果、出力には重複のない配列のリスト、つまり配列フィールドの異なるレベルだけが含まれることになります。なお、$addToSetは要素の順序を保証しないため、出力される配列の並び順は実行ごとに異なる場合がある点に注意してください。

同様の目的には$unwindステージを使う方法もありますが、$unwindは配列の各要素を個別に展開するため、今回のように配列全体を1単位として扱いたい場合は、$addToSetを使う方法が適しています。

  1. MongoDBの$slice演算子で特定フィールドの配列をスライスする方法

    MongoDBの$slice演算子で特定フィールドの配列をスライスする方法MongoDBで配列をスライス(部分的に取得)するには、$slice 演算子を使用します。$slice は find() メソッドの射影(projection)と組み合わせて使うことで、配列フィールドから必要な要素だけを取り出すことができます。まずは、ドキュメントを含むコレクションを作成してみましょう。> db.demo503.insertOne({_id:1,Name:John,Subject:[MySQL,Java,C]}); { acknowledged : true, insertedId : 1 } &g

  2. MongoDBで特定フィールドの配列要素数を取得する方法($size演算子の使い方)

    MongoDBでドキュメント内の特定フィールド(配列)に含まれる要素の数をカウントしたい場合は、集計パイプライン(aggregate)と$size演算子を組み合わせるのが最も簡単な方法です。この記事では、実際のコレクションを作成しながら、配列要素数を取得する具体的な手順を解説します。1. サンプルコレクションの作成まず、配列型のフィールド「Subject」を持つドキュメントを含むコレクションを作成します。> db.demo723.insertOne({Subject:[MySQL,MongoDB]}); { acknowledged : true, insertedId