4D v15で導入されたオブジェクトフィールドは、非構造化データの保存とインデックス作成を可能にします。これは、名前、苗字、誕生日のような共通のデータセットかもしれません。例えば、靴(サイズ、色)、コンピュータ(CPU、メモリ)、プリンター(色、インク)、値のリスト、またはすべての組み合わせの異なる属性が必要なショップのように、レコードごとに異なるデータである可能性もあるのです。
ここに、4Dのお客様からの実際のユーザーストーリーがあります。
「私のバッジアプリケーションは、建物への各人のアクセス権や時間枠を管理します。この情報は、オブジェクトの配列としてデータベースに保存されています(例:{access right, building, time slot})。ある時間帯にある建物にアクセスできる人を探したい」。
4Dは、データを照会するためのいくつかの方法を提供し、インデックスを使用するので、非常に高速です。
4D v16 R2では、さらに機能を強化し、1つのオブジェクトの要素のリスト内部でさらに複雑なクエリーができるようになります。複数のクエリ引数をAND演算子で結合して配列属性で検索する場合、以下のようなレコードを取得することができます。
- マッチする引数が、少なくともひとつの要素に存在する
- マッチする引数が同じ要素にある(新規)
例
次の2つのレコードを例にとって考えてみましょう。
{ "name":"martin", "locations": [ { "kind":"home", "city":"paris" } ] } , { "name":"smith", "locations": [ { "kind":"home", "city":"lyon" }, { "kind":"office", "city":"paris" } ] }
home “の位置の種類が都市“paris“にある人を探したいとします。
マッチする引数が少なくとも1つの要素にある
と書くと
QUERY BY ATTRIBUTE([People];[People]OB_Field; "locations[].kind";=; "home";*)
QUERY BY ATTRIBUTE([People]; & ;[People]OB_Field; "locations[].city";=; "paris")
このクエリでは、“martin“と“smith“が返されます。“smith“は“locations”要素の“kind“が“home“で“city“が“paris“ なので、同じ要素ではないにせよ、”martin“と“smith“を返しています。
一致する引数が同じ要素にある
と書くと
QUERY BY ATTRIBUTE([People];[People]OB_Field; "locations[a].kind";=; "home";*)
QUERY BY ATTRIBUTE([People]; & ;[People]OB_Field; "locations[a].city";=; "paris")
このクエリーは、“ martin “を返します。このクエリは“smith“を返しません。なぜなら、”home“と“paris“という値は同じ配列要素に存在しないからです。
一致する引数が同じ要素にあるレコードのみを取得したい場合は、 リンクした引数を使用する必要があります。クエリ引数をリンクするには、リンクする最初のパスの[ ]の間に文字を追加し、リンクしたすべての引数で同じ文字を繰り返します。
例: locations[a].cityとlocations[a].kind.同じクエリで異なるリンク条件を追加するには、別の文字を使用します。以下のサンプルデータベースをダウンロードして、より多くの例を見ることができます。
詳細は、4D v16 R2のドキュメントを参照してください。