グローバル・ノードのための NoSQL メソッド
以下のサブセクションでは、以下の処理を含む基本の NoSQL スタイル・メソッドについて説明します。
作成、読み取り、更新、削除の処理
繰り返し
その他の処理
この章では、例は以下の単純な Caché データ・セットを基にしています。
^Customer(1)="Jane K. White"
^Customer(1, "address")="Banstead"
^Customer(2)="John P.Jackson"
^Customer(3)="Jane Smith"
グローバル・ノードの保存: set()
同期:
var result = mydata.set(node);
非同期:
mydata.set(node, function(error, result){});
mydata.set(
{global: "Customer", subscripts: [1], data: "Jane K. White"},
function(error, result) {
if (error) { // error (see result.ErrorMessage and result.ErrorCode)
}
else { // success
}
}
);
結果:
Operation successful if no error reported.
グローバル・ノードの取得: get()
同期:
var result = mydata.get(node);
非同期:
mydata.get(node, function(error, result){});
result = mydata.get({global: "Customer", subscripts: [9]});
結果:
{global: "Customer", subscripts: [9], data: "", defined: 0}
mydata.get(
{global: "Customer", subscripts: [1]},
function(error, result) {
if (error) { // error (see result.ErrorMessage and result.ErrorCode)
}
else { // success
}
}
);
結果:
{global: "Customer", subscripts: [1], data: "Jane K. White", defined: 1}
defined プロパティは、グローバル・ノードが実際に定義されている場合は 1 に、定義されていない場合は 0 に設定されることに注意してください。
グローバル・ノードの削除: kill()
同期:
var result = mydata.kill(node);
非同期:
mydata.kill(node, function(error, result){});
mydata.kill(
{global: "Customer", subscripts: [1]},
function(error, result) {
if (error) { // error (see result.ErrorMessage and result.ErrorCode)
}
else { // success
}
}
);
結果:
エラーが報告されない場合、処理は成功です。
グローバル・ノードの存在のテスト: data()
このメソッドは、以下の数値のいずれかを返します。
-
0 — ノードは存在しません。
-
1 — ノードにデータはありますが、サブノードがありません。
-
10 — ノードにデータがありませんが、サブノードはあります。
-
11 — ノードにデータがあり、サブノードがあります。
このメソッドは、以下の数値のいずれかを返します。
-
0 :グローバル・ノードが定義されていません。
-
1 :グローバル・ノードがデータ値を指しています。Global(1)="Data" data(Global(1))
-
10 :グローバル・ノードはデータを指していませんが、添え字が追加されます。Global(1,1)="Data" data(Global(1))
-
11 :グローバル・ノードはデータ値を指しており、添え字が追加されます。Global(1)="Data 1", ^Global(1,1)="Data 1" data(Global(1))
同期:
var result = mydata.data(node);
非同期:
mydata.data(node, function(error, result){});
mydata.data(
{global: "Customer", subscripts: [1]},
function(error, result) {
if (error) { // error (see result.ErrorMessage and result.ErrorCode)
}
else { // success
}
}
);
結果:
{defined: 11}
次のグローバル添え字の取得: next()
特定のレベルの添え字の照合順で次の値を取得します。
同期:
var result = mydata.order(node);
非同期:
mydata.order(node, function(error, result){});
result = mydata.order({global: "Customer", subscripts: [""]},
結果:
{global: "Customer", subscripts: [1], result: "1"}}
result = mydata.next({global: "Customer", subscripts: [3]},
結果:
{global: "Customer", subscripts: [""], result: ""}}
mydata.next(
{global: "Customer", subscripts: [1]},
function(error, result) {
if (error) { // error (see result.ErrorMessage and result.ErrorCode)
}
else { // success
}
}
);
結果:
{global: "Customer", subscripts: [2], result: "2"}}
key = {global: "Customer", subscripts: [""]};
while ((key = user.next(key)).result != "") {
console.log(JSON.stringify(key, null, '\t'))
}
結果:
{global: "Customer", subscripts: [1], result: "1"}}
{global: "Customer", subscripts: [2], result: "2"}}
{global: "Customer", subscripts: [3], result: "3"}}
その順序に定義されている添え字がそれ以上ない場合、結果のプロパティは空の文字列 ("") として返されます。
前のグローバル添え字の取得: previous()
特定のレベルの添え字の照合順で前の値を取得します。
同期:
var result = mydata.previous(node);
非同期:
mydata.previous(node, function(error, result){});
result = mydata.previous({global: "Customer", subscripts: [""]},
結果:
{global: "Customer", subscripts: [3], result: "3"}}
result = mydata.previous({global: "Customer", subscripts: [2]},
結果:
{global: "Customer", subscripts: ["1"], result: "1"}}
mydata.previous(
{global: "Customer", subscripts: [1]},
function(error, result) {
if (error) { // error (see result.ErrorMessage and result.ErrorCode)
}
else { // success
}
}
);
結果:
{global: "Customer", subscripts: [""], result: ""}}
key = {global: "Customer", subscripts: [""]};
while ((key = user.previous(key)).result != "") {
console.log(JSON.stringify(key, null, '\t'))
}
結果:
{global: "Customer", subscripts: [3], result: "3"}}
{global: "Customer", subscripts: [2], result: "2"}}
{global: "Customer", subscripts: [1], result: "1"}}
その順序に定義されている添え字がそれ以上ない場合、結果のプロパティは空の文字列 ("") として返されます。
次のグローバル・ノードの取得: next_node()
添え字のレベルに関係なく、照合順の次のグローバル・ノード全部を取得します。
同期:
var result = mydata.next_node(node);
非同期:
mydata.next_node(node, function(error, result){});
result = mydata.next_node({global: "Customer"},
結果:
{global: "Customer", subscripts: [1], data: "Jane K. White, defined: 1}}
result = mydata.next_node({global: "Customer", subscripts: [3]},
結果:
{global: "Customer", defined: 0}}
mydata.next_node(
{global: "Customer", subscripts: [1]},
function(error, result) {
if (error) { // error (see result.ErrorMessage and result.ErrorCode)
}
else { // success
}
}
);
結果:
{
global: "Customer",
subscripts: [1, "address"],
data: "Banstead",
defined: 1
}
key = {global: "Customer"};
while ((key = user.next_node(key)).defined) {
console.log(JSON.stringify(key, null, '\t'));
}
キー:
{
global: "Customer",
subscripts: [1],
data: "Jane K. White",
defined: 1
}
{
global: "Customer",
subscripts: [1, "address"],
data: "Banstead",
defined: 1
}
{
global: "Customer",
subscripts: [2],
data: "John P.Jackson",
defined: 1
}
{
global: "Customer",
subscripts: [3],
data: "Jane Smith",
defined: 1
}
その順序に定義されているノードがそれ以上ない場合、定義されているプロパティはゼロに設定されます。
前のグローバル・ノードの取得: previous_node()
添え字のレベルに関係なく、照合順の前のグローバル・ノード全部を取得します。
同期:
var result = mydata.previous_node(node);
非同期:
mydata.previous_node(node, function(error, result){});
result = mydata.previous_node({global: "Customer", subscripts: ["z"]},
結果:
{global: "Customer", subscripts: [3], data: "Jane Smith", defined: 1}}
result = mydata.previous_node({global: "Customer", subscripts: [2]},
結果:
{
global: "Customer",
subscripts: [1, "address"],
data: "Banstead",
defined: 1
}
mydata.previous_node(
{global: "Customer", subscripts: [1]},
function(error, result) {
if (error) { // error (see result.ErrorMessage and result.ErrorCode)
}
else { // success
}
}
);
結果:
{global: "Customer", defined: 0}}
key = {global: "Customer", subscripts: ["z"]};
while ((key = user.previous_node(key)).defined) {
console.log(JSON.stringify(key, null, '\t'));
}
結果:
{
global: "Customer",
subscripts: [3],
data: "Jane Smith",
defined: 1
}
{
global: "Customer",
subscripts: [2],
data: "John P.Jackson",
defined: 1
}
{
global: "Customer",
subscripts: [1, "address"],
data: "Banstead",
defined: 1
}
{
global: "Customer",
subscripts: [1],
data: "Jane K. White",
defined: 1
}
その順序に定義されているノードがそれ以上ない場合、定義されているプロパティはゼロに設定されます。
グローバル・ノードに格納された次の整数値の取得: increment()
このメソッドは、ロックを使用することなく、プロセスに (インクリメントした) 整数を一意に割り当てる効率的な手段を提供します。呼び出されると、グローバルに保持されている整数値がインクリメントされ、新しい値が呼び出し元プログラムに返されます。Caché では、この関数に同時にアクセスしている可能性がある複数のプロセスに一意の番号が必ず割り当てられます。
同期:
var result = mydata.increment(node);
非同期:
mydata.increment(node, function(error, result){});
mydata.increment(
{global: "Counter"},
function(error, result) {
if (error) { // error (see result.ErrorMessage and result.ErrorCode)
}
else { // success
}
}
);
結果:
成功した場合は、グローバル ^Counter に保持されている整数値がインクリメントされ、結果として新しい値が返されます。
result = mydata.increment({global: "Counter", increment: 1})
result = mydata.increment({global: "Counter", subscripts: [1], increment: 2})
グローバルのコピー: merge()
merge() メソッドは、グローバル全体またはグローバルのセクションを別のグローバルにコピーします。
同期:
var result = mydata.merge(
{to: {destination_node},
from: {source_node}};
);
非同期:
mydata.merge(
{{ to: {destination_node},
from: {source_node}},
function(error, result){}
);
mydata.merge(
{to: {global: "CopyOfCustomer"},
from: {global: "Customer"}},
function(error, result) {
if (error) { // error (see result.ErrorMessage and result.ErrorCode)
}
else { // success
}
}
);
結果:
成功した場合は、グローバル ^Customer 全体が ^CopyOfCustomer にコピーされます。
mydata.merge(
{to: {global: "Customer", subscripts: [7, "address"]},
from: {global: "Customer", subscripts: [1, "address"]}},
function(error, result) {
if (error) { // error (see result.ErrorMessage and result.ErrorCode)
}
else { // success
}
}
);
結果:
成功した場合は、"Customer(1,'address')" の下に含まれるグローバルのサブセクションが "Customer(7,'address')" にコピーされます。
ディレクトリ内のグローバルのリストの取得: global_directory()
このメソッドは、ディレクトリに格納されているグローバルのリストを取得します。範囲制限プロパティ lo、hi、および max を使用して、返される名前の数を制御できます。
同期:
var result = mydata.global_directory(range);
非同期:
mydata.global_directory (range, function(error, result){});
mydata.global_directory({},
function(error, result) {
if (error) { // error (see result.ErrorMessage and result.ErrorCode)
}
else { // success
}
}
);
結果:
成功した場合は、見つかったグローバル名すべてが格納された配列が返されます。
mydata.global_directory(
{lo: "Cust", hi: "Cust~"},
function(error, result) {
if (error) { // error (see result.ErrorMessage and result.ErrorCode)
}
else { // success
}
}
);
結果:
成功した場合は、Cust で始まるグローバル名すべてが格納された配列が返されます。
グローバル・ノードのロックとロック解除: lock() および unlock()
Caché データベースには、排他的に使用するために、グローバル全体 (^Customer など) またはグローバルのサブセクション (^Customer(1) など) をロックする機能があります。
同期:
var result = mydata.lock(node, timeout);
var result = mydata.unlock(node);
非同期:
mydata.lock(node, timeout, function(error, result){});
mydata.unlock(node, function(error, result){});
mydata.lock(
{global: "Customer", subscripts: [1]}, 10,
function(error, result) {
if (error) { // error (see result.ErrorMessage and result.ErrorCode)
}
else { // success
}
}
);
結果:
エラーが報告されない場合、処理は成功です。グローバルが正常にロックされた場合、戻り値は 1 になります。ロック要求がタイムアウトになった場合、戻り値は 0 になります。
デッドロックの状態を避けるために、コードによって以前ロックしたすべてのグローバル・ノードを特定の時点で忘れずにロック解除してください。ノードが別のプロセスによって既にロックされていると、ロック要求は待機キューに入れられ、timeout が指定されていない場合は永久に (プロセスが終了するまで) 待機することになります。
最後に、プログラムによって保持されているすべてのロックを解放するには、node 引数を指定せずに unlock() メソッドを呼び出します。
var result = mydata.unlock();
mydata.unlock(function(error, result){});
Node.js プロセスによって保持されているすべてのロックは、プロセスが終了したときに解放されます。