MongoDBで一意のレコードのみを表示し、重複データを除外する方法
MongoDBのdistinct()メソッドで重複を除外する
MongoDBで一意(ユニーク)なレコードのみを表示したい場合は、distinct()メソッドを使用します。このメソッドは、指定したフィールドの重複しない値だけを配列として返してくれます。
ここでは、実際にサンプルコレクションを作成しながら、その使い方を確認していきましょう。
1. サンプルコレクションの作成
まず、insertOne()メソッドを使って、意図的に重複した名前を含むドキュメントをいくつか挿入します。
> db.demo613.insertOne({"Name":"Chris"});{
"acknowledged" : true, "insertedId" : ObjectId("5e988bd4f6b89257f5584d88")
}
> db.demo613.insertOne({"Name":"Bob"});{
"acknowledged" : true, "insertedId" : ObjectId("5e988bdbf6b89257f5584d89")
}
> db.demo613.insertOne({"Name":"Bob"});{
"acknowledged" : true, "insertedId" : ObjectId("5e988bddf6b89257f5584d8a")
}
> db.demo613.insertOne({"Name":"David"});{
"acknowledged" : true, "insertedId" : ObjectId("5e988be0f6b89257f5584d8b")
}
> db.demo613.insertOne({"Name":"Chris"});{
"acknowledged" : true, "insertedId" : ObjectId("5e988be2f6b89257f5584d8c")
}
> db.demo613.insertOne({"Name":"Sam"});{
"acknowledged" : true, "insertedId" : ObjectId("5e988be8f6b89257f5584d8d")
}上記の例では、「Chris」と「Bob」がそれぞれ2件ずつ登録されており、合計6件のドキュメントが存在します。
2. find()ですべてのドキュメントを確認する
find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.demo613.find();
実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e988bd4f6b89257f5584d88"), "Name" : "Chris" }
{ "_id" : ObjectId("5e988bdbf6b89257f5584d89"), "Name" : "Bob" }
{ "_id" : ObjectId("5e988bddf6b89257f5584d8a"), "Name" : "Bob" }
{ "_id" : ObjectId("5e988be0f6b89257f5584d8b"), "Name" : "David" }
{ "_id" : ObjectId("5e988be2f6b89257f5584d8c"), "Name" : "Chris" }
{ "_id" : ObjectId("5e988be8f6b89257f5584d8d"), "Name" : "Sam" }ご覧のとおり、「Chris」と「Bob」が重複して表示されています。
3. distinct()で一意のレコードだけを取得する
重複を無視して一意の値のみを取得するには、以下のようにdistinct()メソッドにフィールド名を指定して実行します。
> db.demo613.distinct("Name");実行結果は次のとおりです。
[ "Chris", "Bob", "David", "Sam" ]
まとめ
distinct()メソッドを使えば、コレクション内の特定フィールドから重複を排除した値のリストを簡単に取得できます。集計パイプラインの$groupステージなどを使う方法もありますが、単純にユニークな値の一覧が必要なだけであれば、distinct()が最も手軽で効率的な選択肢となります。
-
MongoDBの$projectで配列内の特定フィールドだけを表示し、他のフィールドを除外する方法
MongoDBの集計パイプライン(Aggregation Pipeline)では、$projectと$unwindを組み合わせることで、配列内の特定のフィールドだけを表示できます。逆に、不要なフィールドを除外したい場合は、そのフィールドの値を0に設定します。サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成しましょう。> db.demo731.insertOne({ ProductInformation: [ { ProductId:Product-1, ProductPrice:80 }, { ProductId:Product-2, ProductPrice:45
-
【MongoDB】ネストされたドキュメントのキー名のみを抽出して表示する方法
MongoDBでは、配列内にネストされたドキュメント(サブドキュメント)のキー名だけを一覧として取得したいケースがあります。本記事では、insertOne()でサンプルデータを作成し、find()で内容を確認した後、集計パイプラインの$reduce、$objectToArray、$map、$concatArraysを組み合わせて、ネストされたドキュメントのキー名のみを抽出する方法を実行例付きで解説します。 1. サンプルコレクションの作成 まず、insertOne()メソッドを使って、detailsフィールドに複数のドキュメントを持つ配列を含むコレクションを作成します。 > db.dem