【MongoDB】ネストされたドキュメントのキー名のみを抽出して表示する方法
MongoDBでは、配列内にネストされたドキュメント(サブドキュメント)のキー名だけを一覧として取得したいケースがあります。本記事では、insertOne()でサンプルデータを作成し、find()で内容を確認した後、集計パイプラインの$reduce、$objectToArray、$map、$concatArraysを組み合わせて、ネストされたドキュメントのキー名のみを抽出する方法を実行例付きで解説します。
1. サンプルコレクションの作成
まず、insertOne()メソッドを使って、detailsフィールドに複数のドキュメントを持つ配列を含むコレクションを作成します。
> db.demo740.insertOne({
... "details":
... [
... {
... Name:"Chris",
... Age:21,
... CountryName:"US"
... },
... {
... Name:"Bob",
... Age:20,
... CountryName:"UK",
... isMarried:true
... }
... ]
... });
{
"acknowledged" : true,
"insertedId" : ObjectId("5ead700c57bb72a10bcf066d")
}
2. 登録されたドキュメントの確認
次に、find()メソッドでコレクション内のすべてのドキュメントを表示します。
> db.demo740.find();
実行すると、以下のような出力が得られます。
"_id" : ObjectId("5ead700c57bb72a10bcf066d"), "details" : [ { "Name" : "Chris", "Age" : 21, "CountryName" : "US" }, { "Name" : "Bob", "Age" : 20, "CountryName" : "UK", "isMarried" : true } ] }
3. ネストされたドキュメントのキー名を取得するクエリ
ここからが本題です。aggregate()メソッドと$projectステージを使用し、$reduce演算子で配列内の各ドキュメントを順番に処理します。各ドキュメントは$objectToArrayによって「キーと値のペア」の配列に変換され、$mapでキー名(k)だけを取り出し、$concatArraysで結果を連結していきます。
> db.demo740.aggregate([
... {
... $project: {
... ListKeys: {
... $reduce: {
... input: "$details",
... initialValue: [],
... in: {
... $concatArrays: [
... "$$value",
... {
... $map: {
... input: {
... $objectToArray: "$$this"
... },
... in: "$$this.k"
... }
... }
... ]
... }
... }
... }
... }
... }
... ]).pretty()
4. 実行結果
このクエリを実行すると、details配列内のすべてのドキュメントからキー名だけが抽出され、ListKeysフィールドにまとめられます。なお、同じキー名(Name、Age、CountryNameなど)はドキュメントごとに重複して表示される点に注意してください。
{
"_id" : ObjectId("5ead700c57bb72a10bcf066d"),
"ListKeys" : [
"Name",
"Age",
"CountryName",
"Name",
"Age",
"CountryName",
"isMarried"
]
}
このように、$reduceと$objectToArrayを組み合わせることで、ネストされたドキュメントのキー名を簡単に一覧化できます。重複を排除したい場合は、$setUnionや$addToSetを追加で活用すると、ユニークなキー名の一覧を取得することも可能です。
-
MongoDBで一意のレコードのみを表示し、重複データを除外する方法
MongoDBのdistinct()メソッドで重複を除外するMongoDBで一意(ユニーク)なレコードのみを表示したい場合は、distinct()メソッドを使用します。このメソッドは、指定したフィールドの重複しない値だけを配列として返してくれます。ここでは、実際にサンプルコレクションを作成しながら、その使い方を確認していきましょう。1. サンプルコレクションの作成まず、insertOne()メソッドを使って、意図的に重複した名前を含むドキュメントをいくつか挿入します。> db.demo613.insertOne({Name:Chris});{ acknowledged : tru
-
Javaを使ってMongoDBコレクションからすべてのドキュメントを取得する方法
MongoDBでは、find()メソッドを使用することで、既存のコレクションからドキュメントを取得できます。この記事では、MongoDBシェルでの基本操作と、Javaプログラムからすべてのドキュメントを取得する手順について詳しく解説します。MongoDBシェルでの構文db.coll.find()各要素の意味は以下のとおりです。db:対象となるデータベースcoll:ドキュメントを取得したいコレクションの名前シェルでの実行例ここでは、MongoDBデータベース内に「students」というコレクションがあり、次のドキュメントが登録されているものとします。{name:"Ram",