Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

構造化された JSON オブジェクトのための NoSQL メソッド

このセクションでは、高度なメソッドについて説明します。これらのメソッドは、そのメソッドを使用しない場合は基本的な NoSQL スタイルのメソッドをいくつか組み合わせることで実行できる処理を実行します。

以下の Caché データを使用して、これらのメソッドについて説明します。

高度な NoSQL の例で使用されるデータ
   ^Customer(1)="Jane K. White"
   ^Customer(1, "Address", 1)="London"
   ^Customer(1, "Address", 2)="UK"
   ^Customer(1, "DateOfRegistration")="1 May 2010"
   ^Customer(2)="John P.Jackson"
   ^Customer(2, "Address", 1)="Reigate"
   ^Customer(2, "Address", 2)="UK"
   ^Customer(2, "DateOfRegistration")="7 May 2010"
   ^Customer(3)="Jane Smith"
   ^Customer(3, "Address", 1)="London"
   ^Customer(3, "Address", 2)="UK"
   ^Customer(3, "DateOfRegistration")="9 June 2010"

グローバル・ノードのリストの取得: retrieve("list")

このメソッドは、グローバル内の指定したレベルの直下に定義されている添え字値のリストを返します。

同期:

   var result = mydata.retrieve(node, "list");

非同期:

   mydata.retrieve(node, "list", function(error, result){});
例 1 :顧客番号のリストを取得します。
   mydata.retrieve(
      {global: "Customer"},
      "list",
      function(error, result) {
         if (error) { // error (see result.ErrorMessage and result.ErrorCode) 
         }
         else { // success 
         }
      }
   );

結果 (3 つの顧客レコード):

   [1, 2, 3]
例 2 :特定の顧客の住所の行のリストを取得します。
   mydata.retrieve(
      {global: "Customer", subscripts: [1, "address"]},
      "list"
      function(error, result) {
         if (error) { // error (see result.ErrorMessage and result.ErrorCode) 
         }
         else { // success 
         }
      }
   );

結果 (顧客番号 1 の住所の 2 行):

   [1, 2]

グローバル・ノードのリストの再帰的取得: retrieve("array")

このメソッドは、グローバル内の指定したレベルの下に定義されている添え字値のリストをそれらに関連付けられたデータ値と共に返します。このメソッドは再帰的であり、選択したレベルの下に定義されているすべてのグローバル・ノードを取得します。

この結果は、複数のグローバル・ノードからなる 1 つの配列として表され、各グローバル・ノードは単一の JSON オブジェクトとして表されます。

同期:

   var result = mydata.retrieve(node, "array");

非同期:

   mydata.retrieve(node, "array", function(error, result){});
例 1 : 1 人の顧客のすべてのデータを取得します。
   mydata.retrieve({global: "Customer", subscripts: [1]}, "array",
      function(error, result) {
         if (error) {
            // error   (see result.ErrorMessage
            //       and result.ErrorCode)
         }
         else {
            // success
         }
      }
   );

結果:

   [
      {   global: "Customer",
      subscripts: [1],
      data: "Jane K. White"
      }
      {   global: "Customer",
      subscripts: [1, "Address", 1],
      data: "London"
      }
      {   global: "Customer",
      subscripts: [1, "Address", 2],
      data: "UK"
      }
      {   global: "Customer",
      subscripts: [1, "DateOfRegistration],
      data: "1 May 2010"
      }
   ]

グローバル・ノードのリストの保存: update("array")

このメソッドは、retrieve メソッドによって実行されるタスクとは逆のタスクを実行します。つまり、update メソッドは、グローバル・ノード (それぞれが単一 JSON オブジェクトとして表されている) からなる 1 つの配列を取り、それらを Caché データベースに戻して書き込みます。

同期:

   var result = mydata.update(node, "array");

非同期:

   mydata.update(node, "array", function(error, result){});
例 1 : 1 人の顧客のレコードを作成または更新します。
   mydata.update([
      {   global: "Customer",
      subscripts: [1],
      data: "Jane K. White"
   }
      {   global: "Customer",
      subscripts: [1, "Address", 1],
      data: "London"
      }
      {   global: "Customer", subscripts: [1, "Address", 2],
      data: "UK"
      }
      {   global: "Customer",
      subscripts: [1, "DateOfRegistration],
      data: "1 May 2010"
      }
      ],
      "array",
      function(error, result) {
         if (error) {
            // error   (see result.ErrorMessage
            //       and result.ErrorCode)
         }
         else {
            // success
         }
      }
   );

結果:

エラーが報告されない場合、処理は成功です。

構造化されたデータ・オブジェクトの取得: retrieve("object")

このメソッドは、グローバル内の指定したレベルの下に定義されている構造化されたデータ・オブジェクトを取得します。このメソッドは、前述のグローバル・ノードからなる配列の代わりとなる構造化データを提供します。

この結果は、単一 JSON オブジェクトとして表されます。

同期:

   var result = mydata.retrieve(node, "object");

非同期:

   mydata.retrieve(node, "object", function(error, result){});
例: 1 人の顧客のすべてのデータを取得します。

以下の構造化された Caché グローバルを考えてみます。

   ^Customer(1, "Name")="Jane K. White"
   ^Customer(1, "Address", 1)="London"
   ^Customer(1, "Address", 2)="UK"
   ^Customer(1, "DateOfRegistration")="1 May 2010"

Node.js で以下のように記述します。

   mydata.retrieve({global: "Customer", subscripts: [1]}, "object"
      function(error, result) {
         if (error) {
            // error    (see result.ErrorMessage
            //       and result.ErrorCode)
         }
         else {
            // success
         }
      }
   );

結果:

   {
      node: {   global: "Customer",
         subscripts: [1]
      }
      object: { Name: "Jane K. White",
         Address: {"1": "London", "2": "UK"}
         DateOfRegistration: "1 May 2010",
      }
   }

構造化されたデータ・オブジェクトの保存: update("object")

このメソッドは、retrieve メソッドによって実行されるタスクとは逆のタスクを実行します。つまり、構造化された JSON オブジェクトの内容を Caché データベースに戻して書き込みます。

同期:

   var result = mydata.update(node, "object");

非同期:

   mydata.update(node, "object", function(error, result){});
例 1 : 1 人の顧客のレコードを作成または更新します。
   mydata.update({   node: {global: "Customer",
                           subscripts: [1]
                  },
            Object: {Name: "Jane K. White",
                  DateOfRegistration: "1 May 2010",
                  Address: {"1": "London", "2": "UK"}
                  },
               "object",
            function(error, result) {
            if (error) {
               // error    (see result.ErrorMessage
               //       and result.ErrorCode)
            }
            else {
               // success
            }
      }
   );

結果:

エラーが報告されない場合、処理は成功です。成功した場合、この例では以下の一連のグローバル・ノードが作成されます。

   ^Customer(1, "Address", 1)="London"
   ^Customer(1, "Address", 2)="UK"
   ^Customer(1, "DateOfRegistration")="1 May 2010"
   ^Customer(1, "Name")="Jane K. White"

取得処理によって返されるデータ量の制御

取得処理は、基盤となるグローバル構造に応じて、Node.js 環境に膨大な量のデータを返すことができます。以下のプロパティをリクエスト側の JSON オブジェクト (つまり、ルート・グローバル・ノードを定義するオブジェクト) に追加すると、返されるデータ量を制限できます。

  • max — 返されるグローバル・ノードの最大数。

  • lo — 返される最も小さいグローバル添え字。

  • hi — 返される最も大きいグローバル添え字。

3 つすべてのプロパティが定義されている場合、max の数のグローバル・ノードが返されると、hi に定義されたグローバル添え字に達していなくても、取得処理は終了します。

以下の Caché グローバルを考えてみます。

   ^Customer(1, "Address", 1)="London"
   ^Customer(1, "Address", 2)="UK"
   ^Customer(1, "DateOfRegistration")="1 May 2010"
   ^Customer(1, "Name")="Jane K. White"
   ^Customer(1, "Orders", 20100501, "Reference")="Order001"
   ^Customer(1, "Orders", 20100503, "Reference")="Order002"
   ^Customer(1, "Orders", 20100507, "Reference")="Order003"
   ^Customer(1, "Orders", 20100509, "Reference")="Order004"
   ^Customer(1, "Orders", 20100510, "Reference")="Order005"
   ^Customer(1, "Orders", 20100520, "Reference")="Order006"
   ^Customer(1, "Orders", 20100527, "Reference")="Order007"
   ^Customer(1, "Orders", 20100906, "Reference")="Order008"
   ^Customer(1, "Orders", 20110104, "Reference")="Order011"
   ^Customer(1, "Orders", 20110203, "Reference")="Order012"
   ^Customer(2, "Address", 1)="Reigate"
   ^Customer(2, "Address", 2)="UK"
   ^Customer(2, "DateOfRegistration")="7 May 2010"
   ^Customer(2, "Name")="John P.Jackson"
   ^Customer(2, "Orders", 20101204, "Reference")="Order009"
   ^Customer(2, "Orders", 20101206, "Reference")="Order010"
   ^Customer(3, "Address", 1)="London"
   ^Customer(3, "Address", 2)="UK"
   ^Customer(3, "DateOfRegistration")="9 June 2010"
   ^Customer(3, "Name")="Jane Smith"
   ^Customer(4, "Name")="Jim Cooper"
   ^Customer(5, "Name")="Eve Simpson"
   ^Customer(6, "Name")="John Cotton"
   ^Customer(7, "Name")="Alison Clarke"
   ^Customer(8, "Name")="Paul Francis"
   ^Customer(9, "Name")="Susan Reed"
   ^Customer(10, "Name")="Mary Dodds"
Note:

Orders セクションの 3 番目の添え字は YYYYMMDD 形式の日付です。

例 1 :登録されている顧客番号を 2 から 7 まで (両端を含む) リストします。
   mydata.retrieve(
      {global: "Customer", lo: 2, hi: 7},
      "list",
      function(error, result) {
         if (error) { // error (see result.ErrorMessage and result.ErrorCode) 
         }
         else { // success 
         }
      }
   );

結果 (6 つの顧客レコード):

   [2, 3, 4, 5, 6, 7]
例 2 : 2010 年 5 月 7 日から 2010 年 12 月 24 日 まで (両端を含む) に顧客番号 1 から出された注文をリストします。
   mydata.retrieve(
      {  global: "Customer",
         subscripts: [1, "Orders"],
         lo: 20100507, 
         hi: 20101224
      },
      "list",
      function(error, result) {
         if (error) { // error (see result.ErrorMessage and result.ErrorCode) 
         }
         else { // success 
         }
      }
   );

結果 (6 つの顧客注文レコード):

   [20100507, 20100509, 20100510, 20100520, 20100527, 20100906]
例 3 : 2010 年 9 月に顧客番号 1 によって出された注文の完全な詳細をリストします。
   mydata.retrieve(
      {  global: "Customer",
         subscripts: [1, "Orders"],
         lo: 20100901, 
         hi: 20100930
      },
      "array",
      function(error, result) {
         if (error) { // error (see result.ErrorMessage and result.ErrorCode) 
         }
         else { // success 
         }
      }
   );

結果 (1 つの顧客注文レコード):

   [
      {  global: "Customer",
         subscripts: [1, "Orders", 20100906, "Reference"]
         data: "Order008"
      }
   ]
例 4 :データベースに (顧客番号別に) 登録されている最初の 3 人の顧客をリストします。
   mydata.retrieve(
      {global: "Customer", max: 3},
      "list",
      function(error, result) {
         if (error) { // error (see result.ErrorMessage and result.ErrorCode) 
         }
         else { // success 
         }
      }
   );

結果 (3 つの顧客レコード):

   [1, 2, 3]
FeedbackOpens in a new tab