MongoDBで特定のフィールド(電話番号)のみを配列形式で取得するクエリの書き方
MongoDBでは、ネストされたドキュメントの中から特定のフィールドだけを取り出したいケースがよくあります。本記事では、distinct()メソッドを使って、電話番号など特定のフィールドのみを配列形式で取得する方法を、サンプルコード付きでわかりやすく解説します。
1. コレクションとドキュメントの作成
まずは、サンプルデータとなるドキュメントを含むコレクションを作成しましょう。
> db.demo166.insertOne({"details" : { "UserName" : "Chris", "UserAge":29, "PhoneDetails" : { "PhoneNumber" : "98646463533" } } });
{
"acknowledged" : true,
"insertedId" : ObjectId("5e368b159e4f06af551997cf")
}
> db.demo166.insertOne({"details" : { "UserName" : "David", "UserAge":21, "PhoneDetails" : { "PhoneNumber" : "87664534654" } } });
{
"acknowledged" : true,
"insertedId" : ObjectId("5e368b159e4f06af551997d0")
}
この例では、ルートレベルの「details」フィールドの中に「UserName」「UserAge」「PhoneDetails」がネストして格納され、さらに「PhoneDetails」の中に「PhoneNumber」が含まれています。
2. find()メソッドですべてのドキュメントを表示
作成したコレクション内のすべてのドキュメントを確認するには、find()メソッドを使用します。
> db.demo166.find();
このクエリを実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e368b159e4f06af551997cf"), "details" : { "UserName" : "Chris", "UserAge" : 29, "PhoneDetails" : { "PhoneNumber" : "98646463533" } } }
{ "_id" : ObjectId("5e368b159e4f06af551997d0"), "details" : { "UserName" : "David", "UserAge" : 21, "PhoneDetails" : { "PhoneNumber" : "87664534654" } } }
通常のfind()ではすべてのフィールドがまとめて返されるため、電話番号だけを一覧として取り出すには別のアプローチが必要です。
3. distinct()で特定のフィールドのみを配列形式で取得する
配列形式で特定のフィールド(ここでは電話番号)のみを返すには、distinct()メソッドを使用します。
> db.demo166.distinct("details.PhoneDetails.PhoneNumber");
実行結果は以下の通りです。
[ "98646463533", "87664534654" ]
まとめ
distinct()メソッドに、ドット記法("details.PhoneDetails.PhoneNumber")でフィールドへのパスを指定することで、ネストされたドキュメントから目的のフィールド値だけを重複なく配列として取得できます。大量のデータの中から特定の値の一覧を手軽に把握したい場合に非常に便利なテクニックなので、ぜひ活用してみてください。
-
MongoDBで配列の要素を1つだけ取得する方法|$slice演算子の使い方
MongoDBの$sliceで配列の要素を1つだけ取得する配列から特定の件数の要素だけを取り出したい場合、MongoDBでは$slice演算子を使用します。$sliceはプロジェクション演算子の一種で、指定した件数分の配列要素のみを返すことができます。ここでは、実際にコレクションを作成し、$sliceを使って配列の先頭1件だけを取得する手順を順番に見ていきましょう。サンプルデータの作成まず、insertOne()メソッドを使ってドキュメントをコレクションに挿入します。> db.demo579.insertOne( ... { ... _id : 101, ...
-
MongoDBで配列をクエリして特定の値を取得する方法
配列から特定の値を取得するには、aggregate()メソッドと$projectステージを組み合わせて使用します。まずは、ドキュメントを含むコレクションを作成してみましょう。 > db.demo761.insertOne( ... { ... "details": [ ... { ... "