MongoDB
 Computer >> コンピューター >  >> プログラミング >> MongoDB

MongoDBでコレクション内のすべてのフィールド名(列名)を取得する方法

MongoDBには「列」の概念が存在しない

MongoDBはスキーマレスなデータベースであるため、リレーショナルデータベースのような「列(カラム)」という概念は存在しません。その代わりに「コレクション」という単位があり、各コレクションには異なる構造を持つドキュメントを自由に格納できます。

そのため、MongoDBで「テーブル内のすべての列名を取得したい」という場合は、実際にはコレクション内のドキュメントが持つ「フィールド名」を確認することになります。

基本的な構文

まず、ドキュメントを挿入するための基本構文は次のとおりです。

db.yourCollectionName.insertOne({"YourFieldName": yourValue, "yourFieldName": "yourValue", ...N});

コレクションからレコードを取得するには、1件だけならfindOne()、全件ならfind()を使用します。

db.yourCollectionName.findOne(); // 1件だけ取得
db.yourCollectionName.find();    // 全件取得

サンプルコレクションの作成

実際に挙動を確認するため、ドキュメントを含むコレクションを作成してみましょう。以下のクエリを順に実行します。

> db.collectionOnDifferentDocumentDemo.insertOne({"UserName":"Larry"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c953b98749816a0ce933682")
}
> db.collectionOnDifferentDocumentDemo.insertOne({"UserName":"David","UserAge":24});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c953ba4749816a0ce933683")
}
> db.collectionOnDifferentDocumentDemo.insertOne({"UserName":"Carol","UserAge":25,"UserCountryName":"US"});
{
   "acknowledged" : true,
   "insertedId" : ObjectId("5c953bb8749816a0ce933684")
}

ご覧のとおり、同じコレクションの中でも、ドキュメントごとに保持しているフィールドが異なります。これこそがスキーマレスなMongoDBの特徴です。

find()ですべてのドキュメントを表示する

find()メソッドを使うと、コレクション内の全ドキュメントを一覧表示できます。

> db.collectionOnDifferentDocumentDemo.find();

実行結果は以下のとおりです。

{ "_id" : ObjectId("5c953b98749816a0ce933682"), "UserName" : "Larry" }
{ "_id" : ObjectId("5c953ba4749816a0ce933683"), "UserName" : "David", "UserAge" : 24 }
{ "_id" : ObjectId("5c953bb8749816a0ce933684"), "UserName" : "Carol", "UserAge" : 25, "UserCountryName" : "US" }

この出力を見れば、コレクション内でどのようなフィールド(列)が使われているかを目視で確認できます。

findOne()で最初の1件を表示する

findOne()メソッドを使うと、コレクションから最初に見つかった1件のドキュメントのみを取得できます。

> db.collectionOnDifferentDocumentDemo.findOne();

実行結果は以下のとおりです。

{ "_id" : ObjectId("5c953b98749816a0ce933682"), "UserName" : "Larry" }

フィールド名の一覧をプログラム的に抽出する

ドキュメント数が多い場合、目視での確認は非効率です。コレクション全体から使用されているフィールド名を一括で抽出したい場合は、シェル上でJavaScriptを使って次のように処理すると便利です。

var allKeys = {};
db.collectionOnDifferentDocumentDemo.find().forEach(function(doc) {
   Object.keys(doc).forEach(function(key) { allKeys[key] = 1; });
});
print(Object.keys(allKeys).sort());

このスクリプトを実行すると、全ドキュメントを走査して重複を除いたフィールド名の一覧が出力されます。上記の例では _idUserAgeUserCountryNameUserName の4つが取得できます。

まとめ

MongoDBはスキーマレスなため列という概念はなく、フィールド名を確認するにはコレクション内のドキュメントを参照します。手軽な確認にはfind()findOne()が有効で、正確な一覧が必要な場合は全ドキュメントを走査してキーを集計するのが確実です。

  1. MongoDBコレクションの全キー(フィールド名)を取得する方法まとめ

    この記事は2019年1月18日にObjectRocket.com/blogで公開された内容をもとにしています。 MongoDB®のコレクションに含まれるすべてのキーを把握することは、スキーマの検証、フィールド名のタイプミスのデバッグ、設定すべきでないフィールドの発見など、さまざまな場面で役立ちます。本記事では、MongoDBコレクション内の全キー名を取得する複数の方法を、状況別にわかりやすく解説します。 まず検討したい:ODMやマネージドサービスの活用 ObjectRocketをはじめとする多くのMongoDB-as-a-Service事業者は、ユーザーインターフェース(UI)上で簡単にキーを

  2. MongoDBコレクション内の全キー名を取得する方法|MapReduce・Aggregation・シェルなど状況別に解説

    スキーマの検証、フィールド名のタイプミスのデバッグ、設定されるべきではないフィールドの発見などを行うには、まずMongoDBコレクション内にどのようなキーが存在するのかを把握しておく必要があります。多くのMongoDB-as-a-Service事業者は、UI上で手軽にこれを実現できる機能を提供しています(ObjectRocketもそのひとつです)。また、経験豊富なMongoDBユーザーの多くは、JavaScript向けのMongooseやPython向けのMongoengineといったオブジェクトドキュメントマッパー(ODM)を導入しています。ODMを使えば、アプリケーション向けの一貫性のある