データベースとコレクション

この項では、MongoDBデータベースおよびコレクションがOracle Databaseのスキーマおよびコレクション表にどのようにマップされるかについて説明します。

データベース

MongoDBデータベースは、関連するコレクションをグループ化します。Oracle Databaseでは、表およびその他の依存オブジェクトを格納する類似の構成にスキーマという用語を使用します。MongoDBのためのOracle Database APIでは、MongoDBコマンドで使用されるデータベース名がOracle Databaseのスキーマ名に変換されます。次のmongoshの例を考えてみます:

use payroll;
db.createCollection('employees');

このスクリプトは、payrollデータベースにemployeesコレクションを作成します。Oracle Databaseに対して実行すると、MongoDBのためのOracle Database APIによって、スキーマpayrollにコレクションemployeesが作成されます。

Oracle Databaseとは異なり、MongoDBはデータベースが存在しない場合は暗黙的に作成します。前述の例では、payrollが存在しない場合、コレクションemployeesの作成時に自動的に作成されます。MongoDBのためのOracle Database APIでは、接続ユーザーが管理ユーザーの場合、スキーマが存在しない場合にのみ暗黙的にスキーマが作成されます。それ以外の場合は、スキーマを事前に作成する必要があります。スキーマは、次のSQLを使用して作成できます:

db.aggregate([{$sql:`create user payroll no authentication`}]);

スキーマの作成後、payrollデータベースを参照するMongoDBコマンドは、同じ名前のスキーマにマップされます。

JSONコレクション

JSONコレクションは、DATAという名前の単一のJSON型列を公開する表またはビューです。JSONコレクション表、JSONコレクション・ビューおよびJSON二面性ビューの3つの異なるタイプがあります。ほとんどのMongoDBコマンドは、JSONコレクションのみと対話できます。他のタイプの表およびデータベース・オブジェクトは表示もアクセスもできません。次の例では、2つのJSONコレクション表とリレーショナル表を作成します:

db.aggregate([{$sql:`create json collection table "employees"`}]);
db.createCollection("departments");
db.aggregate([{$sql:`create table payroll_records(employee_name varchar2(4000), job varchar2(100))`}]);

show collections;
departments
employees

mongoshshow collectionsを実行すると、departmentsおよびemployeesのみが表示され、リレーショナル表payroll_recordsは表示されません。

$sql集計ステージは、この制限の1つの例外です。$sqlは、JSONコレクションではないオブジェクトを含め、任意のデータベース・オブジェクトにアクセスできます。詳細は、「集計パイプライン」を参照してください。

JSONコレクション表

JSONコレクション表にはJSONオブジェクトが格納され、各オブジェクトには表内のオブジェクトを一意に識別する"_id"フィールドが含まれます。重複する"_id"値を挿入すると、エラーが発生します。"_id"フィールドなしでオブジェクトを挿入すると、データベースによって一意の値が生成されます。

コレクションの作成には、MongoDB CREATEコマンドを使用できます。次に例を示します:

db.createCollection('employees');

SQLから同じコレクションを作成するには、create json collection table文を発行します:

db.aggregate([{$sql:`create json collection table "employees"`}]);

JSONコレクション表の詳細は、JSONコレクションを参照してください。

JSONコレクション・ビュー

JSONコレクション・ビューは、データを格納せずにJSONドキュメントのコレクションを返す論理的な構成体です。JSONコレクション・ビューは読取り専用であり、データの挿入、更新または削除の試行は失敗します。集計パイプラインまたはSQLを使用してJSONコレクション・ビューを定義します。

MongoDB集計パイプラインを使用したビューの定義

MongoDB CREATEコマンドに集計パイプラインを指定して、JSONコレクション・ビューを定義します。結果のビューは、パイプラインによって生成されたドキュメントのみを返します。

// create a collection table with three documents
db.createCollection("employees");

db.employees.insertMany([
  {"name" : "SMITH", "job":"CLERK", "sal":800}, 
  {"name" : "ALLEN", "job":"SALESMAN", "sal":1600}, 
  {"name" : "WARD",  "job":"SALESMAN", "sal":1250}
]);

// create a collection view that only returns sales staff
db.createView("sales_staff", "employees", [{"$match" : {"job" : "SALESMAN"}}]);

db.sales_staff.find({}, {"name" : 1, "_id" : 0});
[ { name: 'ALLEN' }, { name: 'WARD' } ]

SQLを使用したビューの定義

create json collection view文を使用してSQLからビューを作成することもできます。この方法では、他のOracle DatabaseデータをJSONドキュメントとして公開します。次に例を示します:

// create a relational table (non-collection) and insert two rows
db.aggregate([{$sql:`create table employees_base(name varchar2(100), job varchar2(50), sal number)`}]);
db.aggregate([{$sql:`insert into employees_base values('SMITH', 'CLERK', 800), ('ALLEN', 'SALESMAN', 1600)`}]);

// create a json collection view that exposes the relational rows a JSON objects
db.aggregate([{$sql:`
   create json collection view jemployees as 
       select json {'name' : name, 'job' : job, 'sal' : sal } 
       from employees_base
`}]);

// query the json collection view
admin> db.jemployees.find();
[ { name: 'SMITH', job: 'CLERK', sal: 800 }, { name: 'ALLEN', job: 'SALESMAN', sal: 1600 } ]

この例では、最初に2行のリレーショナル表employees_baseを作成します。次に、これらの行を2つのJSONオブジェクトとして表すJSONコレクション・ビューjemployeesを定義します。findなどのMongoDBコマンドは、結果のコレクションにアクセスできます。

JSONの二面性ビュー

3番目のタイプのJSONコレクションは、JSON二面性ビューと呼ばれます。JSON二面性ビューは、読取りと書込みの両方をサポートしている点を除いて、JSONコレクション・ビューと似ています。つまり、JSON二面性ビュー・コレクションでは、挿入、更新および削除がサポートされ、これらの操作がビューの定義に使用される基礎となる実表に自動的に伝播されます。JSON二面性ビューについては、「JSON二面性ビュー」を参照してください。