2

特定の要素に特定の子要素がないことを満足するコレクション内のドキュメントを取得したいと思います。たとえば、以下の2つの「ドキュメント」から、要素の子があるのでdoc 2を選択しますが、ないのでdoc1を選択します。

Doc 1

<doc>
 <element>
  <child/>
 </element>
</doc>

Doc2

<doc>
 <element>
  <other-child/>
 </element>
</doc>

私はこれをやってみました:

for $item in collection('/db/collection')
where not($item//child)
return $item

ただし、これは何らかの理由で機能しません。シーケンス関数などのさまざまな組み合わせも試しexistsましたが、思い通りの結果が得られませんでした。

明確にするために、not($item//child)テストは私が思うことをしていないようです。上記のクエリは、要素があるかどうかに関係なく、コレクション内のすべてのドキュメントを返します。ただし、逆は機能します。

for $item in collection('/db/collection')
where $item//child
return $item

このクエリは、子要素を持つドキュメントを正確に返します。

何が得られますか?

4

3 に答える 3

3

目的の結果を得るには、 not() と exists() の両方を使用する必要があると思います。だから、私はあなたが次のようなことをしたいと思う:

for $item in collection('/db/collection') return
    if (not(exists($item//child))) then $item
    else ()

名前空間の問題について: ドキュメントで名前空間を使用している場合は、次のように XQuery ステートメントで適切な名前空間を宣言する必要があります。declare namespace ns="some_uri";

お役に立てれば。
-tjw

于 2010-03-11T05:58:57.980 に答える
0

バグを回避するには、当面は次のようにします。

for $item in collection('/db/collection') 
return 
  if ($item//child) then
    $item
  else 
    ()
于 2009-08-25T10:44:51.990 に答える