在eXist中,如何在动态确定的集合上运行表达式?

时间:2012-02-16 19:15:58

标签: xquery exist-db

我有一个查询,它动态地确定一个集合名称和一个表达式,以便在该集合上评估返回一个布尔值。说:

  • $my-collection指向该集合,例如包含字符串/db/my/collection
  • 布尔表达式为exists(/foo/bar)

我可以在集合本身上运行exists(/foo/bar),它将返回true或false,具体取决于集合中的文档是否包含/foo/bar。但是,如果事先不知道集合名称,我怎么能这样做呢?

天真地,我试过collection($my-collection)/exists(/foo/bar)。但是由于collection()返回集合中的文档节点,这将返回与集合中的文档一样多的布尔值,而不是仅返回一个布尔值。这不是我想要的,而且它可能非常慢,因为我的集合可以包含数万个文档。

那么,我应该怎么写呢?

1 个答案:

答案 0 :(得分:1)

您可以将表达式重写为:

exists(collection($my-collection)/foo/bar)

或许这个,取决于eXists查询优化器,可能表现更好:

exists((collection($my-collection)/foo/bar)[1])

HTH!