MongoDBコレクション内のすべてのフィールド名を取得する方法
MapReduceを使ってフィールド名を取得する
MongoDBのコレクションに含まれるすべてのフィールド名を一覧として取得したい場合は、MapReduceの仕組みを利用するのが便利です。ここでは、実際にサンプルコレクションを作成しながら、フィールド名を抽出する手順を順番に解説していきます。
1. サンプルコレクションの作成
まず、insertOne()メソッドを使ってドキュメントを1件登録し、テスト用のコレクションを作成します。
> db.getAllFieldNamesDemo.insertOne({"StudentFirstName":"David","StudentAge":23});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd998e9b50a6c6dd317ad90")
}2. 登録内容の確認
find()メソッドを実行して、コレクション内のすべてのドキュメントを表示してみましょう。
> db.getAllFieldNamesDemo.find();
実行すると、次のような結果が得られます。
{ "_id" : ObjectId("5cd998e9b50a6c6dd317ad90"), "StudentFirstName" : "David", "StudentAge" : 23 }3. すべてのフィールド名を抽出するクエリ
続いて、MapReduceを使ってコレクション内の全フィールド名を取得します。map関数で各ドキュメントのキー(フィールド名)をemitし、reduce関数で重複をまとめるのがポイントです。
> myMapReduce = db.runCommand({
"mapreduce" : "getAllFieldNamesDemo",
"map" : function() {
for (var myKey in this) { emit(myKey, null); }
},
"reduce" : function(myKey, s) { return null; },
"out": "getAllFieldNamesDemo" + "_k"
})
{
"result" : "getAllFieldNamesDemo_k",
"timeMillis" : 1375,
"counts" : {
"input" : 1,
"emit" : 3,
"reduce" : 0,
"output" : 3
},
"ok" : 1
}
> db[myMapReduce.result].distinct("_id");4. 実行結果
上記のクエリを実行すると、コレクション内のフィールド名が配列形式で出力されます。
[ "StudentAge", "StudentFirstName", "_id" ]
このように、「StudentAge」「StudentFirstName」、そして自動的に付与される「_id」の3つのフィールド名が正しく取得できました。
補足:集計フレームワークを使った代替方法
なお、MapReduceはMongoDB 4.2以降では非推奨とされているため、新しいバージョンを使用している場合は、集計フレームワーク(Aggregation Framework)の$objectToArray演算子を活用する方法もおすすめです。
> db.getAllFieldNamesDemo.aggregate([
{ $project: { fields: { $objectToArray: "$$ROOT" } } },
{ $unwind: "$fields" },
{ $group: { _id: null, allFields: { $addToSet: "$fields.k" } } }
])使用しているMongoDBのバージョンや用途に応じて、最適な方法を選択してください。
-
MongoDBコレクションの全キー(フィールド名)を取得する方法まとめ
この記事は2019年1月18日にObjectRocket.com/blogで公開された内容をもとにしています。 MongoDB®のコレクションに含まれるすべてのキーを把握することは、スキーマの検証、フィールド名のタイプミスのデバッグ、設定すべきでないフィールドの発見など、さまざまな場面で役立ちます。本記事では、MongoDBコレクション内の全キー名を取得する複数の方法を、状況別にわかりやすく解説します。 まず検討したい:ODMやマネージドサービスの活用 ObjectRocketをはじめとする多くのMongoDB-as-a-Service事業者は、ユーザーインターフェース(UI)上で簡単にキーを
-
MongoDBコレクション内の全キー名を取得する方法|MapReduce・Aggregation・シェルなど状況別に解説
スキーマの検証、フィールド名のタイプミスのデバッグ、設定されるべきではないフィールドの発見などを行うには、まずMongoDBコレクション内にどのようなキーが存在するのかを把握しておく必要があります。多くのMongoDB-as-a-Service事業者は、UI上で手軽にこれを実現できる機能を提供しています(ObjectRocketもそのひとつです)。また、経験豊富なMongoDBユーザーの多くは、JavaScript向けのMongooseやPython向けのMongoengineといったオブジェクトドキュメントマッパー(ODM)を導入しています。ODMを使えば、アプリケーション向けの一貫性のある