構造化された JSON オブジェクトのための NoSQL メソッド
このセクションでは、高度なメソッドについて説明します。これらのメソッドは、そのメソッドを使用しない場合は基本的な NoSQL スタイルのメソッドをいくつか組み合わせることで実行できる処理を実行します。
以下の Caché データを使用して、これらのメソッドについて説明します。
^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){});
mydata.retrieve(
{global: "Customer"},
"list",
function(error, result) {
if (error) { // error (see result.ErrorMessage and result.ErrorCode)
}
else { // success
}
}
);
結果 (3 つの顧客レコード):
[1, 2, 3]
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){});
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){});
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){});
以下の構造化された 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){});
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"
Orders セクションの 3 番目の添え字は YYYYMMDD 形式の日付です。
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]
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]
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"
}
]
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]