ewd 3トレーニングコース#25 globalストレージのjavascript用抽象化-(f)...

48
EWD 3 トトトトトト トトト #25 Global トトトトトト JavaScript トトトトト -(f) Document トトトトトトトトトトトト M/Gateway Developments Ltd. Rob Tweed ト : トトトトトトトトトトトトト ト トト

Upload: kiyoshi-sawada

Post on 15-Apr-2017

40 views

Category:

Software


0 download

TRANSCRIPT

EWD 3トレーニング・コース  #25

Global ストレージの JavaScript 用の抽象化

-(f) Document データベースのできること

M/Gateway Developments Ltd.Rob Tweed

訳 : 日本ダイナシステム株式会社 嶋 芳成

2

Document データベースとしての Global ストレージ

2016/9/19 EWD 3 トレーニング・コース #25

3

1 対 1 対応

myDoc("a") = 123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1a")="bar1a"myDoc("d","e1","f2a")="bar2a"myDoc("d","e2","f1b")="bar1b"myDoc("d","e2","f2b")="bar2b"myDoc("d","e2","f3b")="bar3b"

myObj = { a: 123, b: { c1: 'foo', c2: 'foo2' }, d: { e1: { f1a: 'bar1a', f2a: 'bar2a' } e2: { f1b: 'bar1b', f2b: 'bar2b', f3b: 'bar3b' } }}

2016/9/19 EWD 3 トレーニング・コース #25

Document データベースのメソッド• Documents データベースに対する DocumentNode

メソッド/ JSON マッピング

• getDocument()• setDocument()

2016/9/19 EWD 3 トレーニング・コース #25 4

DocumentNode オブジェクトのインスタンス化var doc = new this.documentStore.DocumentNode('myDoc');

myDoc("a") = 123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1a")="bar1a"myDoc("d","e1","f2a")="bar2a"myDoc("d","e2","f1b")="bar1b"myDoc("d","e2","f2b")="bar2b"myDoc("d","e2","f3b")="bar3b"

2016/9/19 EWD 3 トレーニング・コース #25 5

getDocument()var doc = new this.documentStore.DocumentNode('myDoc');var myObj = doc.getDocument();

myDoc("a") = 123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1a")="bar1a"myDoc("d","e1","f2a")="bar2a"myDoc("d","e2","f1b")="bar1b"myDoc("d","e2","f2b")="bar2b"myDoc("d","e2","f3b")="bar3b"

2016/9/19 EWD 3 トレーニング・コース #25 6

生成する

myObj = { a: 123, b: { c1: 'foo', c2: 'foo2' }, d: { e1: { f1a: 'bar1a', f2a: 'bar2a' } e2: { f1b: 'bar1b', f2b: 'bar2b', f3b: 'bar3b' } }}

getDocument()var doc = new this.documentStore.DocumentNode('myDoc');var myObj = doc.getDocument();

myDoc("a") = 123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1a")="bar1a"myDoc("d","e1","f2a")="bar2a"myDoc("d","e2","f1b")="bar1b"myDoc("d","e2","f2b")="bar2b"myDoc("d","e2","f3b")="bar3b"

2016/9/19 EWD 3 トレーニング・コース #25 7

生成する

myObj は、標準のメモリ内の JavaScript オブジェクトで、 DocumentNode の階層構造の、指定された節の下の部分木のデータのコピーを保持しています

myObj = { a: 123, b: { c1: 'foo', c2: 'foo2' }, d: { e1: { f1a: 'bar1a', f2a: 'bar2a' } e2: { f1b: 'bar1b', f2b: 'bar2b', f3b: 'bar3b' } }}

setDocument()var myObj = { // 右に示すオブジェクトを生成する }

2016/9/19 EWD 3 トレーニング・コース #25 8

myObj = { a: 123, b: { c1: 'foo', c2: 'foo2' }, d: { e1: { f1a: 'bar1a', f2a: 'bar2a' } e2: { f1b: 'bar1b', f2b: 'bar2b', f3b: 'bar3b' } }}

setDocument()var myObj = { // 右に示すオブジェクトを生成する }var doc = new this.documentStore.DocumentNode('myDoc');// これはまだディスク上には存在しない

2016/9/19 EWD 3 トレーニング・コース #25 9

myObj = { a: 123, b: { c1: 'foo', c2: 'foo2' }, d: { e1: { f1a: 'bar1a', f2a: 'bar2a' } e2: { f1b: 'bar1b', f2b: 'bar2b', f3b: 'bar3b' } }}

setDocument()var myObj = { // 右に示すオブジェクトを生成する }var doc = new this.documentStore.DocumentNode('myDoc');doc.setDocument(myObj);

myDoc("a") = 123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1a")="bar1a"myDoc("d","e1","f2a")="bar2a"myDoc("d","e2","f1b")="bar1b"myDoc("d","e2","f2b")="bar2b"myDoc("d","e2","f3b")="bar3b"

2016/9/19 EWD 3 トレーニング・コース #25 10

myObj = { a: 123, b: { c1: 'foo', c2: 'foo2' }, d: { e1: { f1a: 'bar1a', f2a: 'bar2a' } e2: { f1b: 'bar1b', f2b: 'bar2b', f3b: 'bar3b' } }}

生成する

setDocument()var myObj = { // 右に示すオブジェクトを生成する }var doc = new this.documentStore.DocumentNode('myDoc');doc.setDocument(myObj);

myDoc("a") = 123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1a")="bar1a"myDoc("d","e1","f2a")="bar2a"myDoc("d","e2","f1b")="bar1b"myDoc("d","e2","f2b")="bar2b"myDoc("d","e2","f3b")="bar3b"

2016/9/19 EWD 3 トレーニング・コース #25 11

myObj = { a: 123, b: { c1: 'foo', c2: 'foo2' }, d: { e1: { f1a: 'bar1a', f2a: 'bar2a' } e2: { f1b: 'bar1b', f2b: 'bar2b', f3b: 'bar3b' } }}

生成する

myDoc は、ディスク上に生成され、そこには myObj オブジェクトの保持するデータのコピーが格納されていますこれで、 Global ストレージの節 ( ノード ) と対応されました

任意の DocumentNode に適応できることこれらのメソッドは、ディスク上の Document の任意のレベルのノードに適用できます

var dnode = new this.documentStore.DocumentNode('myDoc', ['d']);

myDoc("a") = 123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1a")="bar1a"myDoc("d","e1","f2a")="bar2a"myDoc("d","e2","f1b")="bar1b"myDoc("d","e2","f2b")="bar2b"myDoc("d","e2","f3b")="bar3b"

2016/9/19 EWD 3 トレーニング・コース #25 12

任意の DocumentNode に適応できることこれらのメソッドは、ディスク上の Document の任意のレベルのノードに適用できます

var dnode = new this.documentStore.DocumentNode('myDoc', ['d']);var myObj = dnode.getDocument()

myDoc("a") = 123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1a")="bar1a"myDoc("d","e1","f2a")="bar2a"myDoc("d","e2","f1b")="bar1b"myDoc("d","e2","f2b")="bar2b"myDoc("d","e2","f3b")="bar3b"

2016/9/19 EWD 3 トレーニング・コース #25 13

myObj = { e1: { f1a: 'bar1a', f2a: 'bar2a' } e2: { f1b: 'bar1b', f2b: 'bar2b', f3b: 'bar3b' }}

任意の DocumentNode に適応できることこれらのメソッドは、ディスク上の Document の任意のレベルのノードに適用できます

var dnode = new this.documentStore.DocumentNode('myDoc', ['d']);var myObj = dnode.getDocument()

myDoc("a") = 123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1a")="bar1a"myDoc("d","e1","f2a")="bar2a"myDoc("d","e2","f1b")="bar1b"myDoc("d","e2","f2b")="bar2b"myDoc("d","e2","f3b")="bar3b"

2016/9/19 EWD 3 トレーニング・コース #25 14

myObj = { e1: { f1a: 'bar1a', f2a: 'bar2a' } e2: { f1b: 'bar1b', f2b: 'bar2b', f3b: 'bar3b' }}

myObj は、 myDoc("d") の下位節 ( 下位ノード ) の部分木だけから生成されます

任意の DocumentNode に適応できることこれらのメソッドは、ディスク上の Document の任意のレベルのノードに適用できます

var dnode = new this.documentStore.DocumentNode('myDoc', ['d']);

myDoc("a") = 123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1a")="bar1a"myDoc("d","e1","f2a")="bar2a"myDoc("d","e2","f1b")="bar1b"myDoc("d","e2","f2b")="bar2b"myDoc("d","e2","f3b")="bar3b"

2016/9/19 EWD 3 トレーニング・コース #25 15

任意の DocumentNode に適応できることこれらのメソッドは、ディスク上の Document の任意のレベルのノードに適用できます

var dnode = new this.documentStore.DocumentNode('myDoc', ['d']);var myObj = { // 右に示したオブジェクトを生成します };

myDoc("a") = 123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1a")="bar1a"myDoc("d","e1","f2a")="bar2a"myDoc("d","e2","f1b")="bar1b"myDoc("d","e2","f2b")="bar2b"myDoc("d","e2","f3b")="bar3b"

2016/9/19 EWD 3 トレーニング・コース #25 16

myObj = { g: 1000, h2: { w1: 'foo', w2: 'bar' }}

任意の DocumentNode に適応できることこれらのメソッドは、ディスク上の Document の任意のレベルのノードに適用できます

var dnode = new this.documentStore.DocumentNode('myDoc', ['d']);var myObj = { // 右に示したオブジェクトを生成します };dnode.setDocument(myObj);

myDoc("a") = 123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1a")="bar1a"myDoc("d","e1","f2a")="bar2a"myDoc("d","e2","f1b")="bar1b"myDoc("d","e2","f2b")="bar2b"myDoc("d","e2","f3b")="bar3b"myDoc("d","g")=1000myDoc("d","h2","w1")="foo"myDoc("d","h2","w2")="bar"

2016/9/19 EWD 3 トレーニング・コース #25 17

myObj = { g: 1000, h2: { w1: 'foo', w2: 'bar' }}

任意の DocumentNode に適応できることこれらのメソッドは、ディスク上の Document の任意のレベルのノードに適用できます

var dnode = new this.documentStore.DocumentNode('myDoc', ['d']);var myObj = { // 右に示したオブジェクトを生成します };dnode.setDocument(myObj);

myDoc("a") = 123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1a")="bar1a"myDoc("d","e1","f2a")="bar2a"myDoc("d","e2","f1b")="bar1b"myDoc("d","e2","f2b")="bar2b"myDoc("d","e2","f3b")="bar3b"

2016/9/19 EWD 3 トレーニング・コース #25 18

myObj = { e2: { f3b: 'new value', f4b: 'bar4b' }, g: 1000, h2: { w1: 'foo', w2: 'bar' }}

任意の DocumentNode に適応できることこれらのメソッドは、ディスク上の Document の任意のレベルのノードに適用できます

var dnode = new this.documentStore.DocumentNode('myDoc', ['d']);var myObj = { // 右に示したオブジェクトを生成します };dnode.setDocument(myObj);

myDoc("a") = 123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1a")="bar1a"myDoc("d","e1","f2a")="bar2a"myDoc("d","e2","f1b")="bar1b"myDoc("d","e2","f2b")="bar2b"myDoc("d","e2","f3b")="new value"myDoc("d","e2","f4b")="bar4b"myDoc("d","g")=1000myDoc("d","h2","w1")="foo"myDoc("d","h2","w2")="bar"2016/9/19 EWD 3 トレーニング・コース #25 19

myObj = { e2: { f3b: 'new value', f4b: 'bar4b' }, g: 1000, h2: { w1: 'foo', w2: 'bar' }}

任意の DocumentNode に適応できることこれらのメソッドは、ディスク上の Document の任意のレベルのノードに適用できます

var dnode = new this.documentStore.DocumentNode('myDoc', ['d']);var myObj = { // 右に示したオブジェクトを生成します };dnode.delete();

myDoc("a") = 123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e1","f1a")="bar1a"myDoc("d","e1","f2a")="bar2a"myDoc("d","e2","f1b")="bar1b"myDoc("d","e2","f2b")="bar2b"myDoc("d","e2","f3b")="bar3b"

2016/9/19 EWD 3 トレーニング・コース #25 20

myObj = { e2: { f3b: 'new value', f4b: 'bar4b' }, g: 1000, h2: { w1: 'foo', w2: 'bar' }}

任意の DocumentNode に適応できることこれらのメソッドは、ディスク上の Document の任意のレベルのノードに適用できます

var dnode = new this.documentStore.DocumentNode('myDoc', ['d']);var myObj = { // 右に示したオブジェクトを生成します };dnode.delete();

myDoc("a") = 123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"

2016/9/19 EWD 3 トレーニング・コース #25 21

myObj = { e2: { f3b: 'new value', f4b: 'bar4b' }, g: 1000, h2: { w1: 'foo', w2: 'bar' }}

任意の DocumentNode に適応できることこれらのメソッドは、ディスク上の Document の任意のレベルのノードに適用できます

var dnode = new this.documentStore.DocumentNode('myDoc', ['d']);var myObj = { // 右に示したオブジェクトを生成します };dnode.delete();dnode.setDocument(myObj);

myDoc("a") = 123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d","e2","f3b")="new value"myDoc("d","e2","f4b")="bar4b"myDoc("d","g")=1000myDoc("d","h2","w1")="foo"myDoc("d","h2","w2")="bar"

2016/9/19 EWD 3 トレーニング・コース #25 22

myObj = { e2: { f3b: 'new value', f4b: 'bar4b' }, g: 1000, h2: { w1: 'foo', w2: 'bar' }}

23

getDocument() と setDocument() のさらに進んだ機

2016/9/19 EWD 3 トレーニング・コース #25

配列のマッピング

myDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d",0)="value0"myDoc("d",1)="value1"myDoc("d",2)="value2"myDoc("d",3)="value3"myDoc("d",4)="value4"myDoc("d",5)="value5"myDoc("d",6)="value6"

Global ストレージ内での配列は、慣例に過ぎませんが、添字値として連続する整数を用います

2016/9/19 EWD 3 トレーニング・コース #25 24

配列のマッピング

myDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d",1)="value1"myDoc("d",2)="value2"myDoc("d",3)="value3"myDoc("d",4)="value4"myDoc("d",5)="value5"myDoc("d",6)="value6"

Global ストレージ内での配列は、慣例に過ぎませんが、添字値として連続する整数を用います

旧来のアプリケーションでは、番号付けは通常 1 からです

2016/9/19 EWD 3 トレーニング・コース #25 25

配列のマッピングvar myDoc = new this.documentStore.DocumentNode('myDoc');

var myObj = myDoc.getDocument();

myDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d",0)="value0"myDoc("d",1)="value1"myDoc("d",2)="value2"myDoc("d",3)="value3"myDoc("d",4)="value4"myDoc("d",5)="value5"myDoc("d",6)="value6"

      getDocument() は、これらをオブジェクトにマップする

myObj = { a: 123, b: { c1: 'foo', c2: 'foo2' } d: { "0": "value0", "1": "value1", "2": "value2", "3": "value3", "4": "value4", "5": "value5", "6": "value6" }}

2016/9/19 EWD 3 トレーニング・コース #25 26

配列のマッピング何故 JavaScript の配列にマッピングしないのでしょうか?

myDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d",0)="value0"myDoc("d",1)="value1"myDoc("d",2)="value2"myDoc("d",3)="value3"myDoc("d",4)="value4"myDoc("d",5)="value5"myDoc("d",6)="value6"

myObj = { a: 123, b: { c1: 'foo', c2: 'foo2' } d: [ "value0", "value1", "value2", "value3", "value4", "value5", "value6" ]}

2016/9/19 EWD 3 トレーニング・コース #25 27

配列のマッピング何故 JavaScript の配列にマッピングしないのでしょうか?

もし2番目の項目がディスク上に存在しなくなったら ?

myDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d",0)="value0"myDoc("d",1)="value1"myDoc("d",2)="value2"myDoc("d",3)="value3"myDoc("d",4)="value4"myDoc("d",5)="value5"myDoc("d",6)="value6"

myObj = { a: 123, b: { c1: 'foo', c2: 'foo2' } d: [ "value0", "value1", "value2", "value3", "value4", "value5", "value6" ]}

2016/9/19 EWD 3 トレーニング・コース #25 28

配列のマッピング何故 JavaScript の配列にマッピングしないのでしょうか?もし2番目の項目がディスク上に存在しなくなったら ?要素の番号がもはや一致しなくなります

myDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d",0)="value0"myDoc("d",1)="value1"

myDoc("d",3)="value3"myDoc("d",4)="value4"myDoc("d",5)="value5"myDoc("d",6)="value6"

myObj = { a: 123, b: { c1: 'foo', c2: 'foo2' } d: [ "value0", "value1",

"value3", "value4", "value5", "value6" ]}

2016/9/19 EWD 3 トレーニング・コース #25 29

myDoc("d",3) myObj.d[2]

配列のマッピング何故 JavaScript の配列にマッピングしないのでしょうか?もし2番目の項目がディスク上に存在しなくなったら ?setDocument() を再度用いると問題が生じます

myDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d",0)="value0"myDoc("d",1)="value1"myDoc("d",2)="value3"myDoc("d",3)="value4"myDoc("d",4)="value5"myDoc("d",5)="value6"

myObj = { a: 123, b: { c1: 'foo', c2: 'foo2' } d: [ "value0", "value1", "value3", "value4", "value5", "value6" ]}

2016/9/19 EWD 3 トレーニング・コース #25 30

配列のマッピング何故 JavaScript の配列にマッピングしないのでしょうか?

整数以外の添字があると順序が狂います

myDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d",0)="value0"myDoc("d",1)="value1"myDoc("d",2)="value2"myDoc("d",3)="value3"myDoc("d",4)="value4"myDoc("d",5)="value5"myDoc("d",6)="value6"myDoc("d","foo")="bar"

myObj = { a: 123, b: { c1: 'foo', c2: 'foo2' } d: [ "value0", "value1", "value2", "value3", "value4", "value5", "value6" ]}

2016/9/19 EWD 3 トレーニング・コース #25 31

配列のマッピング何故 JavaScript の配列にマッピングしないのでしょうか?

整数の順序が狂っていない添字なら配列にマップ可能?

myDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d",0)="value0"myDoc("d",1)="value1"myDoc("d",2)="value2"myDoc("d",3)="value3"myDoc("d",4)="value4"myDoc("d",5)="value5"myDoc("d",6)="value6"

myObj = { a: 123, b: { c1: 'foo', c2: 'foo2' } d: [ "value0", "value1", "value2", "value3", "value4", "value5", "value6" ]}

2016/9/19 EWD 3 トレーニング・コース #25 32

配列のマッピング何故 JavaScript の配列にマッピングしないのでしょうか?

整数の順序が狂っていない添字なら配列にマップ可能?

myDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d",0)="value0"myDoc("d",1)="value1"myDoc("d",2)="value2"myDoc("d",3)="value3"myDoc("d",4)="value4"myDoc("d",5)="value5"myDoc("d",6)="value6"myDoc("d","foo")="bar"

myObj = { a: 123, b: { c1: 'foo', c2: 'foo2' } d: { "0": "value0", "1": "value1", "2": "value2", "3": "value3", "4": "value4", "5": "value5", "6": "value6" "foo": "bar" }}

2016/9/19 EWD 3 トレーニング・コース #25 33

配列のマッピング何故 JavaScript の配列にマッピングしないのでしょうか?整数の順序が狂っていない添字なら配列にマップ可能? これは、性能上に大きな問題が生じることになるでしょう

myDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d",0)="value0"myDoc("d",1)="value1"myDoc("d",2)="value2"myDoc("d",3)="value3"myDoc("d",4)="value4"myDoc("d",5)="value5"myDoc("d",6)="value6" … 省略 …myDoc("d",301839979)="not good"

myObj = { a: 123, b: { c1: 'foo', c2: 'foo2' } d: [ "value0", "value1", "value2", "value3", "value4", "value5", "value6" … "not good" ]}2016/9/19 EWD 3 トレーニング・コース #25 34

配列のマッピング何故 JavaScript の配列にマッピングしないのでしょうか?整数の順序が狂っていない添字なら配列にマップ可能? これは、性能上に大きな問題が生じることになるでしょう すべての添字値をチェックする必要が生じるのですmyDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d",0)="value0"myDoc("d",1)="value1"myDoc("d",2)="value2"myDoc("d",3)="value3"myDoc("d",4)="value4"myDoc("d",5)="value5"myDoc("d",6)="value6" … 省略 …myDoc("d",301839979)="not good"

myObj = { a: 123, b: { c1: 'foo', c2: 'foo2' } d: [ "value0", "value1", "value2", "value3", "value4", "value5", "value6" … "not good" ]}2016/9/19 EWD 3 トレーニング・コース #25 35

何百万もの添字をチェックすることはできますが…

配列のマッピングvar myDoc = new this.documentStore.DocumentNode('myDoc');

var myObj = myDoc.getDocument();

myDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d",0)="value0"myDoc("d",1)="value1"myDoc("d",2)="value2"myDoc("d",3)="value3"myDoc("d",4)="value4"myDoc("d",5)="value5"myDoc("d",6)="value6"

      getDocument() は、性能維持のためにオブジェクトとの間     でマップします

myObj = { a: 123, b: { c1: 'foo', c2: 'foo2' } d: { "0": "value0", "1": "value1", "2": "value2", "3": "value3", "4": "value4", "5": "value5", "6": "value6" }}

2016/9/19 EWD 3 トレーニング・コース #25 36

配列のマッピングvar myDoc = new this.documentStore.DocumentNode('myDoc');

myDoc.setDocument(myObj);

myDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d",0)="value0"myDoc("d",1)="value1"myDoc("d",2)="value2"myDoc("d",3)="value3"myDoc("d",4)="value4"myDoc("d",5)="value5"myDoc("d",6)="value6"

     そして、 JavaScript オブジェクトと両方向の変換で曖昧さを     排除したマッピングのためです

myObj = { a: 123, b: { c1: 'foo', c2: 'foo2' } d: { "0": "value0", "1": "value1", "2": "value2", "3": "value3", "4": "value4", "5": "value5", "6": "value6" }}

2016/9/19 EWD 3 トレーニング・コース #25 37

マップされた配列を利用するvar myDoc = new this.documentStore.DocumentNode('myDoc');var myObj = myDoc.getDocument();

for (var index in myObj.d) { console.log('element index: ' + myObj.d[index]); }

     forEach 何とかではなく、ループには for を使う必要    があります

myObj = { a: 123, b: { c1: 'foo', c2: 'foo2' } d: { "0": "value0", "1": "value1", "2": "value2", "3": "value3", "4": "value4", "5": "value5", "6": "value6" }}

2016/9/19 EWD 3 トレーニング・コース #25 38

JavaScript 配列についてはどうなる?

JavaScript には正式な配列型があります

例えば右の myObj.d は JavaScript の配列です

myObj = { a: 123, b: { c1: 'foo', c2: 'foo2' } d: [ "value0", "value1", "value2", "value3", "value4", "value5", "value6" ]}

2016/9/19 EWD 3 トレーニング・コース #25 39

JavaScript 配列についてはどうなる?

JavaScript には正式な配列型があります

例えば右の myObj.d は JavaScript の配列です

これらを setDocument() はどのように処理するのでしょう?

myObj = { a: 123, b: { c1: 'foo', c2: 'foo2' } d: [ "value0", "value1", "value2", "value3", "value4", "value5", "value6" ]}

2016/9/19 EWD 3 トレーニング・コース #25 40

setDocument() による配列のマッピングvar myDoc = new this.documentStore.DocumentNode('myDoc');myDoc.delete()myDoc.setDocument(myObj);

myDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d",0)="value0"myDoc("d",1)="value1"myDoc("d",2)="value2"myDoc("d",3)="value3"myDoc("d",4)="value4"myDoc("d",5)="value5"myDoc("d",6)="value6"

   

myObj = { a: 123, b: { c1: 'foo', c2: 'foo2' } d: [ "value0", "value1", "value2", "value3", "value4", "value5", "value6" ]}

2016/9/19 EWD 3 トレーニング・コース #25 41

setDocument() による配列のマッピングvar myDoc = new this.documentStore.DocumentNode('myDoc');myDoc.delete()myDoc.setDocument(myObj);

myDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d",0)="value0"myDoc("d",1)="value1"myDoc("d",2)="value2"myDoc("d",3)="value3"myDoc("d",4)="value4"myDoc("d",5)="value5"myDoc("d",6)="value6"

    ゼロ「 0 」から始まる整数連番の添え字にマッピングされます

myObj = { a: 123, b: { c1: 'foo', c2: 'foo2' } d: [ "value0", "value1", "value2", "value3", "value4", "value5", "value6" ]}

2016/9/19 EWD 3 トレーニング・コース #25 42

従来の Global ストレージのマッピングvar myDoc = new this.documentStore.DocumentNode('myDoc');myDoc.delete()myDoc.setDocument(myObj);

myDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d",1)="value1"myDoc("d",2)="value2"myDoc("d",3)="value3"myDoc("d",4)="value4"myDoc("d",5)="value5"myDoc("d",6)="value6"

    従来の MUMPS を統合する場合、 1 から始まる連番に    ついてはどうなるでしょうか?

myObj = { a: 123, b: { c1: 'foo', c2: 'foo2' } d: [ "value1", "value2", "value3", "value4", "value5", "value6" ]}

2016/9/19 EWD 3 トレーニング・コース #25 43

従来の Global ストレージのマッピングvar myDoc = new this.documentStore.DocumentNode('myDoc');

var myObj = myDoc.getDocument();

myDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d",1)="value1"myDoc("d",2)="value2"myDoc("d",3)="value3"myDoc("d",4)="value4"myDoc("d",5)="value5"myDoc("d",6)="value6"

     getDocument() によるマッピングは正しく働きます

myObj = { a: 123, b: { c1: 'foo', c2: 'foo2' } d: { "1": "value1", "2": "value2", "3": "value3", "4": "value4", "5": "value5", "6": "value6" }}

2016/9/19 EWD 3 トレーニング・コース #25 44

従来の Global ストレージのマッピングvar myDoc = new this.documentStore.DocumentNode('myDoc');myDoc.delete()myDoc.setDocument(myObj);

myDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d",1)="value1"myDoc("d",2)="value2"myDoc("d",3)="value3"myDoc("d",4)="value4"myDoc("d",5)="value5"myDoc("d",6)="value6"

    オブジェクトからの逆のマッピングも正しく作動します

myObj = { a: 123, b: { c1: 'foo', c2: 'foo2' } d: { "1": "value1", "2": "value2", "3": "value3", "4": "value4", "5": "value5", "6": "value6" }}

2016/9/19 EWD 3 トレーニング・コース #25 45

setDocument() による配列のマッピングvar myDoc = new this.documentStore.DocumentNode('myDoc');myDoc.delete()myDoc.setDocument(myObj);

myDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d",0)="value1"myDoc("d",1)="value2"myDoc("d",2)="value3"myDoc("d",3)="value4"myDoc("d",4)="value5"myDoc("d",5)="value6"

    しかし、配列からはゼロ「 0 」に始まる整数連番の添え字に マッピングされます

myObj = { a: 123, b: { c1: 'foo', c2: 'foo2' } d: [ "value1", "value2", "value3", "value4", "value5", "value6" ]}

2016/9/19 EWD 3 トレーニング・コース #25 46

setDocument() による配列のマッピングvar myDoc = new this.documentStore.DocumentNode('myDoc');myDoc.delete()var offset = 1;myDoc.setDocument(myObj, offset);

myDoc("a")=123myDoc("b","c1")="foo"myDoc("b","c2")="foo2"myDoc("d",1)="value1"myDoc("d",2)="value2"myDoc("d",3)="value3"myDoc("d",4)="value4"myDoc("d",5)="value5"myDoc("d",6)="value6"

    第2引数としてオフセットを指定しなければ、です

myObj = { a: 123, b: { c1: 'foo', c2: 'foo2' } d: [ "value1", "value2", "value3", "value4", "value5", "value6" ]}

2016/9/19 EWD 3 トレーニング・コース #25 47

48

ユニークで強力なドキュメント・データベース• 粒度が細かい• すなわち、ディスク上のドキュメント内のどのレ

ベルにも適用可能• setDocument() を用いて巨大なドキュメントを

保存• getDocument() を用いることで、ある

DocumentNode の下の下位節を検索します• ディスク上の Document につい

て、 DocumentNode の value プロパティを利用することで、その Document の任意のレベルで名前/値のペアを読み書き可能

2016/9/19 EWD 3 トレーニング・コース #25