3

MarkLogic の Java API を利用して、marklogic データベース内で 2 つのドキュメントを結合する方法はありますか?

たとえば、次の 2 つのドキュメントがあるとします。

doc1.xml:

<a>    
    <id>123</id>
    <doc2ID>111</doc2ID>
    <first_name>John</first_name>
</a>

doc2.xml:

<b>
    <id>111</id>
    <doc1ID>123</doc1ID>
    <last_name>Smith</last_name>
    <age>25</age>
</b>

MarkLogic で次のクエリを作成できますか? SQL では次のようにします: Select a.first_name, b.last_name from doc1 a JOIN doc2 b ON (a.doc2ID = b.id) WHERE a.first_name = 'John' and b.last_name = 'Smith' and b.年齢 > 24

4

2 に答える 2

2

あるドキュメントを別のドキュメントのフィルターとして使用したいだけの場合は、サブクエリを実装するカスタム制約を使用してクエリ オプションを送信できます。

実際にドキュメントを結合したい場合は、cts:search() レベルで結合を実装するリソース サービス拡張を作成する必要があります。

ただし、一歩下がって、ドキュメントを非正規化することを検討する必要があります。そうすれば、リレーショナル データベースの場合ほど結合する必要がなくなります。上で提供したドキュメントは、本質的にテーブルの行であり、ドキュメント データベースの機能と柔軟性を利用していません。リレーショナル モデルとリレーショナル クエリを使用することは、ドキュメント データベースでは最善の方法ではありません。

于 2013-05-10T18:02:40.660 に答える
0

あなたのサンプルは有効ではなくxml(ルート要素がありません)、おそらく複数の子要素があります。有効でなければxml、答えを正確にするのは難しいです。

一般的な方法は、FLOWR 式を使用することです。

for $master in doc("doc1.xml")//something,   
    $detail in doc("doc2.xml")//something 
where $master/doc2ID = $detail/id
return ($master/first_name/string(), $detail/last_name/string())
于 2013-05-10T16:51:27.883 に答える