以下のようなドキュメント構成で、上位からn番目の親ドキュメントのテンプレート変数の値を取得したい場合があるとします。
例えば、各ジャンルごとに入っている最下層のBLOGのドキュメント(2010/01/10分など)から、ジャンル名を取得したいとします。テンプレートは各階層毎に同一です。
・TOP
・ジャンルA
・BLOGコンテナA
・2010/01/10
・2010/01/11
・BLOGコンテナB
・2010/01/10
・2010/01/11
・ジャンルB
・BLOGコンテナA
・2010/01/10
・2010/01/11
この場合、手段としては二つあります。
・GetFieldのネストで取得する方法。
[[GetField? &parent=`1` &topid=[[GetField? &parent=`1` &field=`id`]] &field=`取得するテンプレート変数名`]]
・UltimateParentで2番目の親ドキュメントIDを取得し、GetFieldのdocidに指定し取得する方法。
[[GetField? &docid=`[[UltimateParent? &topLevel=`2`]]` &field=`取得するテンプレート変数名`]]
どちらも同じように取得できますが、GetFieldで親ドキュメントを取得すると、DBアクセスの頻度が極端に増大します。
UltimateParentでドキュメントIDを取得し、GetFieldでそのIDを用いて取得する方がパフォーマンス向上につながります。
[[GetField? &parent=`1` &field=`取得するテンプレート変数名`]]
よりも
[[GetField? &docid=`[[UltimateParent? &topLevel=`1`]]` &field=`取得するテンプレート変数名`]]
の方がクエリ回数は少ないです。
#恐らく、UltimateParentはシステム変数のツリールート構造を取得しているはず。ソース追っかけてませんけどね。
#[^q^] で表示されるクエリー発行回数を見ながら調整してたら、劇的に数値が改善されたので。