MongoDBでSQLの「SELECT DISTINCT(name) FROM collectionName WHERE age = 25」に相当するクエリを書く方法
MongoDBにおけるSELECT DISTINCTの代替手段
リレーショナルデータベースのSQLで使われるSELECT DISTINCTと同じ処理をMongoDBで実現したい場合は、distinct()メソッドを使用します。このメソッドを使うと、指定したフィールドの重複しない値を取得できます。
ここでは、年齢が25歳のクライアントの名前を重複なく取得する例を見ていきましょう。
サンプルコレクションの作成
まず、ドキュメントを含むコレクションを作成します。
> db.distinctNameAndAgeDemo.insertOne({"ClientFirstName":"John","Age":23});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd12759e3526dbddbbfb60b")
}
> db.distinctNameAndAgeDemo.insertOne({"ClientFirstName":"Larry","Age":25});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd12768e3526dbddbbfb60c")
}
> db.distinctNameAndAgeDemo.insertOne({"ClientFirstName":"David","Age":25});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd12773e3526dbddbbfb60d")
}
> db.distinctNameAndAgeDemo.insertOne({"ClientFirstName":"Carol","Age":26});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd1277ee3526dbddbbfb60e")
}
> db.distinctNameAndAgeDemo.insertOne({"ClientFirstName":"Sam","Age":25});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd12793e3526dbddbbfb60f")
}
> db.distinctNameAndAgeDemo.insertOne({"ClientFirstName":"Larry","Age":25});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd127a3e3526dbddbbfb610")
}
> db.distinctNameAndAgeDemo.insertOne({"ClientFirstName":"Carol","Age":26});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd127aae3526dbddbbfb611")
}上記のコレクションには、同じ名前・年齢の組み合わせを持つドキュメント(Larry、Carol)が複数登録されている点に注目してください。
登録済みドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示します。
> db.distinctNameAndAgeDemo.find().pretty();
実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5cd12759e3526dbddbbfb60b"),
"ClientFirstName" : "John",
"Age" : 23
}
{
"_id" : ObjectId("5cd12768e3526dbddbbfb60c"),
"ClientFirstName" : "Larry",
"Age" : 25
}
{
"_id" : ObjectId("5cd12773e3526dbddbbfb60d"),
"ClientFirstName" : "David",
"Age" : 25
}
{
"_id" : ObjectId("5cd1277ee3526dbddbbfb60e"),
"ClientFirstName" : "Carol",
"Age" : 26
}
{
"_id" : ObjectId("5cd12793e3526dbddbbfb60f"),
"ClientFirstName" : "Sam",
"Age" : 25
}
{
"_id" : ObjectId("5cd127a3e3526dbddbbfb610"),
"ClientFirstName" : "Larry",
"Age" : 25
}
{
"_id" : ObjectId("5cd127aae3526dbddbbfb611"),
"ClientFirstName" : "Carol",
"Age" : 26
}distinct()メソッドで重複を排除して取得する
SQLのselect distinct(name) from collectionName where age = "25"に相当するMongoDBのクエリは次のとおりです。
> db.distinctNameAndAgeDemo.distinct("ClientFirstName", {"Age": 25});このクエリを実行すると、以下の出力が得られます。
[ "Larry", "David", "Sam" ]
ご覧のとおり、年齢が25歳のクライアント名だけが抽出され、重複する値(Larry)は自動的に除外されています。
distinct()メソッドのポイント
- 第一引数:重複を排除したいフィールド名を指定します(ここでは「ClientFirstName」)。
- 第二引数:絞り込み条件(クエリドキュメント)を指定します(ここでは「Age: 25」)。条件を省略すると、コレクション全体が対象になります。
このように、MongoDBではdistinct()メソッド一つで、SQLのSELECT DISTINCTとWHERE句を組み合わせた処理をシンプルに実現できます。
-
【MongoDB】$where演算子で請求先住所と配送先住所が一致するドキュメントを検索する方法
MongoDBでは、同一ドキュメント内の異なるフィールド同士を比較したい場面があります。たとえば、請求先住所(billingAddress)と配送先住所(deliveryAddress)が一致しているレコードだけを取り出したいケースです。このような比較には、$where演算子を使用します。以下、具体的な手順をサンプルコード付きで解説します。サンプルコレクションの作成まず、テスト用のコレクションに複数のドキュメントを挿入します。> db.demo589.insertOne({deliveryAddress:"US",billingAddress:"UK&quo
-
MongoDBのドキュメントの最大サイズはどれくらい?16MB制限の基本を解説
MongoDBのドキュメントとはMongoDBにおける「ドキュメント」とは、コレクション内に格納される1件のレコードのことです。ドキュメントはJSONに似たBSON形式で表現され、波括弧({})で囲まれたデータ構造を持ちます。重要なポイントとして、各ドキュメントには16MBというサイズ上限が設けられています。この制限を超えるサイズのドキュメントを挿入しようとすると、エラーが発生します。なお、画像や動画などの大きなバイナリデータを扱いたい場合は、GridFSという仕組みを利用することで、16MBを超えるデータも保存可能です。ドキュメントを含むコレクションを作成するそれでは、実際にinsertOn