InterSystems IRIS® Data Platform の DocDB は、データベース・データの保存と取得のための機能です。従来の SQL のテーブルおよびフィールド (クラスおよびプロパティ) データの保存や取得との互換性はありますが、これとは別の機能です。また、Web ベースのデータ交換をサポートする JSON (JavaScript Object Notation) がベースになっています。InterSystems IRIS は、DocDB データの作成と照会のための SQL サポートを提供するだけでなく、REST や ObjectScript での DocDB データベースおよびアプリケーションの開発のためのサポートも提供します。
InterSystems IRIS ドキュメント データベースは、本質的に、スキーマレスなデータ構造です。つまり、各ドキュメントがそれぞれ独自の構造を持ちます。この構造は、同じデータベース内の他のドキュメントと異なる場合もあります。これには、事前定義されたデータ構造を必要とする SQL よりも優れたメリットがいくつか存在します。
ここでは、「ドキュメント」という用語が、業界全体で使用される特殊な専門用語として、動的なデータ保存構造の意味で使用されます。DocDB で使用される「ドキュメント」をテキスト・ドキュメントや文書と混同しないようにしてください。
DocDB のコンポーネント
DocDB のパッケージ名は %DocDB です。これには、以下のクラスが含まれています。
関連クラスは、JSON 構造を含めるのに使用され、JSON 配列と JSON key:value オブジェクトのサブクラスが含まれる %Library.DynamicAbstractObjectOpens in a new tab です。
データベースの作成
データベースは、抽象クラス %DocDB.DocumentOpens in a new tab を拡張する ObjectScript 永続クラスです。DocDB で使用するネームスペースごとにデータベースをインスタンス化する必要があります。ネームスペースごとに必要になるデータベースは 1 つのみです。通常、ネームスペース名と同じ名前が割り当てられます。
次の例は、クラス定義を使用してデータベースを作成する方法を示しています。
Class MyDBs.People Extends %DocDB.Document [ DdlAllowed ]
次の例は、パッケージ名の指定による、%CreateDatabase()Opens in a new tab メソッドを使用したデータベースの作成方法を示しています。
SET personDB = ##class(%DocDB.Database).%CreateDatabase("MyDBs.People")
次の例は、ISC.DM のデフォルトのパッケージ名の取得による、%CreateDatabase()Opens in a new tab メソッドを使用したデータベースの作成方法を示しています。
SET personDB = ##class(%DocDB.Database).%CreateDatabase("People")
%SYSTEM.DocDBOpens in a new tab クラスは、ドキュメント・データベースを管理するためのインタフェースを提供します。
ドキュメント・データベースの作成または取得、データベースへのドキュメントの入力、およびそれらのドキュメントからのデータの取得に使用される API メソッドの詳細については、“ドキュメントの管理” の章を参照してください。
JSON 構造
InterSystems IRIS ドキュメント データベースは、JSON ダイナミック・オブジェクトと JSON 動的配列をサポートします。これらの JSON 構造は、SET コマンドを使用して作成できます。
次の例は、JSON を使用して階層データを保存する方法を示しています。最初の SET は、入れ子になった JSON 構造の key:value ペアおよび配列を含む動的な抽象オブジェクトを作成します。その後、この例では、動的な抽象オブジェクトが JSON 文字列に変換され、その JSON 文字列がドキュメントとして既存のドキュメント・データベース内に挿入されます。
SET dynAbObj = {
"FullName":"John Smith",
"FirstName":"John",
"Address":{
"street":"101 Main Street",
"city":"Mapleville",
"state":"NY",
"postal code":10234
},
"PhoneNumber":
[
{"type":"home","number":"212-456-9876"},
{"type":"cell","number":"401-123-4567"},
{"type":"work","number":"212-444-5000"}
]
}
SET jstring = dynAbObj.%ToJSON() // dynamic abstract object to JSON string
DO personDB.%FromJSON(jstring) // JSON string inserted into document database
この例では、FullName は単純な key:value ペアとして保存されます。Address は、key:value ペアで構成されるオブジェクトして保存されるサブ構造を持ちます。PhoneNumber は、配列として保存されるサブ構造を持ちます。
詳細は、"JSON の使用" の “ダイナミック・エンティティの作成と変更” を参照してください。
ドキュメント
ドキュメントは、作成したデータベース・クラスのインスタンスの %DocOpens in a new tab プロパティで保存されます。これは、次の例で示されています。この例では、%Doc プロパティで JSON 配列が保存されます。
SET jarry = ["Anne","Bradford","Charles","Deborah"]
SET myoref = ##class(MyDBs.DB1).%New()
SET myoref.%Doc = jarry
SET docoref = myoref.%Doc
WRITE "%Doc property oref: ",docoref,!
WRITE "%Doc Property value: ",docoref.%ToJSON()
既定では、%Doc のデータ型は %Library.DynamicAbstractObjectOpens in a new tab です。これは、JSON オブジェクトまたは JSON 配列の保存に使用されるデータ型です。%CreateDatabase()Opens in a new tab メソッドで異なるデータ型を指定できます。
その他のデータベース・プロパティ :
正規化されていないデータ構造
以下に示すのは、従来の SQL の正規化されたリレーショナル・データ構造の JSON の例です。これは、2 つのドキュメントで構成されます。これらのドキュメントは、2 つの異なるコレクションに含まれる場合もあります。
{
"id":123,
"Name":"John Smith",
"DOB":"1990-11-23",
"Address":555
}
{
"id":555,
"street":"101 Main Street",
"city":"Mapleville",
"state":"NY",
"postal code":10234
}
以下に示すのは、入れ子になったデータ構造を含むコレクション内の単一ドキュメントとして指定された、正規化されていない同一のデータです。
{
"id":123,
"Name":"John Smith",
"DOB":"1990-11-23",
"Address":{
"street":"101 Main Street",
"city":"Mapleville",
"state":"NY",
"postal code":10234
}
}
SQL では、最初のデータ構造から 2 つ目のデータ構造に変換する場合、テーブル・データの定義を変更してからデータを移行する必要があります。
DocDB では、固定スキーマが存在しないため、これらの 2 つのデータ構造は、同じデータの異なる表現として共存できます。アクセスするデータ構造をアプリケーション・コードで指定する必要があります。データは、新しいデータ構造に移行することもでき、古いデータ構造形式のままにしておくこともできます。後者の場合、新しいデータ構造を使用してデータにアクセスする際に毎回データが移行されます。
JSON データ構造の詳細は、このマニュアルの “柔軟なデータ構造” の章を参照してください。
データ型とデータ値
DocDB では、キーはデータ型を持ちません。しかしながら、DocDB にインポートされたデータ値は、関連付けられたデータ型を持つことができます。データ型は特定の値に関連付けられるため、値を他の値に置換した場合、そのレコードの key:value ペアのデータ型が変更される場合があります。
InterSystems IRIS DocDB には、予約語や特別な名前付け規約が一切存在しません。key:value ペアでは、任意の文字列をキーとして使用でき、任意の文字列または数値を値として使用できます。キー名は、"name":"name" のように値と同一にすることができます。キー名は、インデックス名と同一にすることができます。
以下のテーブルのように、InterSystems IRIS DocDB は、データ値を JSON 値として表します。
データ値 |
表現 |
文字列 |
文字列 |
数値 |
数値は、"キャノニック形式" で表されます。ただし、例外として、1 から -1 までの JSON 小数は先頭に整数ゼロを付けて表されます (例 : 0.007)。対応する InterSystems IRIS の数値は、先頭に整数ゼロを付けずに表されます (例 : .007)。 |
$DOUBLE の数値 |
"IEEE 倍精度 (64 ビット) 浮動小数点数" として表されます。 |
非表示文字 |
JSON では、以下の非表示文字のエスケープ・コード表現が用意されています。
$CHAR(8): ”\b”
$CHAR(9): ”\t”
$CHAR(10): ”\n”
$CHAR(12): ”\f”
$CHAR(13): ”\r”その他の非表示文字はすべて、エスケープされた 16 進数で表されます。例えば、$CHAR(11) は ”\u000b” として表されます。エスケープされた 16 進数 (Unicode) 表記を使用して表示可能文字を表すこともできます。例えば、ギリシャ文字の小文字のアルファは、”\u03b1” として表すことができます。 |
その他のエスケープ文字 |
JSON は、2 つの表示可能文字 (二重引用符文字とバックスラッシュ文字 (円記号)) をエスケープします。
$CHAR(34): ”\””
$CHAR(92): ”\\” |
特殊な JSON 値
特殊な JSON 値は、JSON オブジェクトと JSON 配列内でのみ使用できます。これらの値は、対応する特殊な ObjectScript 値とは異なります。特殊な JSON 値は、引用符なしで指定されます (同じ値を引用符で囲んで指定すると、通常のデータ値として扱われます)。これらの値は大文字と小文字の任意の組み合わせで指定でき、すべて小文字として保存されます。
-
JSON では、特殊な null 値を使用して、値が存在しないことを表します。実際の値が存在しない場合は、通常、ドキュメント・データベースに key:value ペアは含まれないため、null は特別な条件でのみ使用されます (予想値のプレースホルダなど)。この null の使用法は、以下の例を参照してください。
SET jsonobj = {"name":"Fred","spouse":null}
WRITE jsonobj.%ToJSON()
-
JSON では、特殊な true 値および false 値を使用してブーリアン値を表します。このブーリアン値の使用法は、以下の例を参照してください。
SET jsonobj = {"name":"Fred","married":false}
WRITE jsonobj.%ToJSON()
ObjectScript では、0 と 1 を使用してブーリアン値を指定します (実際は、"true" は 1 に限らず、ゼロ以外の任意の数値で表すことができます)。これらの値は、JSON ドキュメント内でブーリアン値としてサポートされません。
いくつかの特殊な場合において、JSON では、構文をわかりやすくするために括弧を使用します。
-
null、true、または false という名前でローカル変数を定義する場合、これを特殊な JSON 値ではなく、ローカル変数として扱うために、JSON 内で括弧を使用する必要があります。詳細は、以下の例を参照してください。
SET true=1
SET jsonobj = {"bool":true,"notbool":(true)}
WRITE jsonobj.%ToJSON()
-
式内で ObjectScript の "後続関係演算子" (]) を使用する場合、これを JSON 配列の終端文字ではなく後続関係演算子として扱うために、JSON 内で括弧を使用する必要があります。次の例では、照合順で b が a の後に続くかどうかを式 b]a がテストし、ObjectScript のブーリアン値を返します。後続関係式は括弧で囲む必要があります。
SET a="a",b="b"
SET jsonarray=[(b]a)]
WRITE jsonarray.%ToJSON()