MongoDBでdistinct()とsort()を組み合わせて重複のない値をソート付きで取得する方法
MongoDBでソート済みの一意な値を取得するには
MongoDBでは、distinct()メソッドを使うことで特定フィールドの重複を除いた値を取得できます。さらに、JavaScriptのsort()メソッドを組み合わせれば、結果を昇順にソートすることも可能です。基本的な構文は以下の通りです。
db.yourCollectionName.distinct("yourFieldName").sort();distinct()は配列を返すため、そのまま.sort()を呼び出して並べ替えができる点がポイントです。それでは、実際にサンプルコレクションを作成しながら動作を確認していきましょう。
1. サンプルコレクションの作成
まず、ドキュメントを含むコレクションを作成します。ここでは学生情報を格納する「getDistinctWithSortedDataDemo」コレクションを使用します。
> db.getDistinctWithSortedDataDemo.insertOne({"StudentId":10,"StudentName":"John","StudentAge":23});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9b1e3315e86fd1496b38c3")
}
> db.getDistinctWithSortedDataDemo.insertOne({"StudentId":20,"StudentName":"Carol","StudentAge":21});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9b1e3e15e86fd1496b38c4")
}
> db.getDistinctWithSortedDataDemo.insertOne({"StudentId":10,"StudentName":"John","StudentAge":23});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9b1e4415e86fd1496b38c5")
}
> db.getDistinctWithSortedDataDemo.insertOne({"StudentId":30,"StudentName":"Chris","StudentAge":22});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9b1e5115e86fd1496b38c6")
}
> db.getDistinctWithSortedDataDemo.insertOne({"StudentId":20,"StudentName":"Carol","StudentAge":21});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9b1e5715e86fd1496b38c7")
}
> db.getDistinctWithSortedDataDemo.insertOne({"StudentId":40,"StudentName":"Bob","StudentAge":20});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9b1e6515e86fd1496b38c8")
}
> db.getDistinctWithSortedDataDemo.insertOne({"StudentId":40,"StudentName":"Bob","StudentAge":20});
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9b1e6d15e86fd1496b38c9")
}このコレクションには7件のドキュメントが登録されており、「StudentId」「StudentName」「StudentAge」にはそれぞれ重複した値が含まれています。
2. 登録したドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。
> db.getDistinctWithSortedDataDemo.find().pretty();
実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5c9b1e3315e86fd1496b38c3"),
"StudentId" : 10,
"StudentName" : "John",
"StudentAge" : 23
}
{
"_id" : ObjectId("5c9b1e3e15e86fd1496b38c4"),
"StudentId" : 20,
"StudentName" : "Carol",
"StudentAge" : 21
}
{
"_id" : ObjectId("5c9b1e4415e86fd1496b38c5"),
"StudentId" : 10,
"StudentName" : "John",
"StudentAge" : 23
}
{
"_id" : ObjectId("5c9b1e5115e86fd1496b38c6"),
"StudentId" : 30,
"StudentName" : "Chris",
"StudentAge" : 22
}
{
"_id" : ObjectId("5c9b1e5715e86fd1496b38c7"),
"StudentId" : 20,
"StudentName" : "Carol",
"StudentAge" : 21
}
{
"_id" : ObjectId("5c9b1e6515e86fd1496b38c8"),
"StudentId" : 40,
"StudentName" : "Bob",
"StudentAge" : 20
}
{
"_id" : ObjectId("5c9b1e6d15e86fd1496b38c9"),
"StudentId" : 40,
"StudentName" : "Bob",
"StudentAge" : 20
}3. StudentNameフィールドの一意な値をソート付きで取得
次に、「StudentName」フィールドに対してdistinct()とsort()を組み合わせたクエリを実行します。
> db.getDistinctWithSortedDataDemo.distinct("StudentName").sort();実行結果は以下の通りです。重複が除去され、アルファベット順(昇順)にソートされているのがわかります。
[ "Bob", "Carol", "Chris", "John" ]
4. StudentAgeフィールドの一意な値をソート付きで取得
同様に、数値型の「StudentAge」フィールドでも試してみましょう。
> db.getDistinctWithSortedDataDemo.distinct("StudentAge").sort();数値の場合も、重複が除去され昇順にソートされた結果が返されます。
[ 20, 21, 22, 23 ]
まとめ
このように、MongoDBではdb.collectionName.distinct("fieldName").sort()というシンプルな記述だけで、重複を排除した上でソート済みの一意な値を簡単に取得できます。文字列でも数値でも同様に動作するため、カテゴリ一覧や選択肢の候補などを表示したい場合など、実務でも幅広く活用できるテクニックです。
-
MongoDBですべてのサブドキュメントからオブジェクトの一意なペアを取得する方法
MongoDBで重複を排除した一意な(distinct)オブジェクトのペアを取得するには、集計パイプラインの $group 演算子を使用します。この記事では、実際のコード例を使って、すべてのサブドキュメントから名前ごとにスコアをグループ化し、合計値を求める方法を解説します。サンプルコレクションの作成まず、insertOne() メソッドを使ってドキュメントを含むコレクションを作成します。> db.demo522.insertOne({Name:John,Score:45});{ acknowledged : true, insertedId : ObjectId(5e89b6
-
MongoDBでグループごとの最大値を取得する方法($sortと$groupの活用)
MongoDBで、重複している個別の要素(グループ)ごとに最大値を取得したい場合、aggregate()メソッドと$sort・$groupステージを組み合わせることで実現できます。この記事では、実際のコード例を通じて、その手順をわかりやすく解説します。サンプルコレクションの作成まず、ドキュメントを含むコレクションを作成します。ここではdemo750というコレクションに、idとvalueフィールドを持つドキュメントを挿入します。> db.demo750.insertOne({id:101,value:50}); { acknowledged : true, inserted