我有以下Marklogic查询,当在查询控制台中运行时,允许我检索具有管理员权限的系统用户:
xquery version "1.0-ml";
import schema namespace bfa="http://bitfood.org/auth" at "schema/auth/bitfood-auth.xsd";
cts:search(/bfa:AppUser[bfa:appAccess/@appRole = "ROLE_SYS_ADMIN"], cts:and-query(()))
请原谅我的无知,但是是否可以仅使用Java客户端API实现此查询?
我知道我可以通过XCC使用原始查询,但我试图尽可能地避免这种情况。
我一直在深入研究Java客户端API的文档,遗憾的是,该文档简要介绍了其他搜索方法,并没有发现任何暗示这是可行的。
更新1:伙计们,我想我已经在这里遇到了一个停滞不前。
根据this question,Java客户端API的查询选项构建工具被标记为已弃用。
@ehennum建议使用XML或JSON查询选项的替代方案。但是,此类查询选项规范为still essentially defined as raw Strings in the code:
String xmlOptions =
"<search:options "+
"xmlns:search='http://marklogic.com/appservices/search'>"+
"<search:constraint name='industry'>"+
"<search:value>"+
"<search:element name='industry' ns=''/>"+
"</search:value>"+
"</search:constraint>"+
"</search:options>";
当然,我可以使用JAXB,JDOM,文件或其他工具来创建XML,但我个人认为我们仍然使用storing queries in resource files in the code,这本身并不是一件坏事,但没有仔细考虑可能导致代码维护噩梦。
此外,这些选项需要在服务器上通过REST持久化这一事实引入了另外一层潜在问题,以防这是强制性的,因为选项可能需要与每个要与之一起工作的数据库实例同步。代码库。
因此,如果Marklogic开发人员正在监听,我认为Java客户端API并不像我预期的那样成熟或有文档记录。
到目前为止我有两个选择:
1)我可以在String文件中对我的XCC查询进行硬编码,并尝试使用参数占位符来插入我需要的数据并通过XCC会话检索。或
2)查看http://marklogic.com/appservices/search
命名空间是否有任何XSD文件,并从中创建静态JAXB对象,以构建某种“条件”类a la Hibernate或QueryDSL可悲的是,我必须说,已经支持某种级别的MongoDB查询。
伙计们,真的,将一些像QueryDSL这样流畅的查询工具带到Marklogic并摆脱这个Rube Goldberg querying machine。
更新2:好像可以在ML7中解决这个问题。期待它。
谢谢!
答案 0 :(得分:4)
背景: Java API是REST API上的一层,是Search API上的一层,是cts上的一层:搜索
您可以在Search API中表达此查询。
对查询选项http://docs.marklogic.com/guide/search-dev/search-api#id_43671中的第一个参数使用可搜索的表达式
对结构化查询http://docs.marklogic.com/guide/search-dev/structured-query#id_83674
使用Java API,您可以使用查询选项和结构化查询作为RawCombinedQueryDefinition进行搜索。
所有这一切,您还可以在bfa上搜索元素查询:AppUser包含bfa上的值约束查询:appAccess / @ appRole“ROLE_SYS_ADMIN”
虽然XPath很方便,但最好熟悉查询表达式,以了解数据库的全部功能和灵活性。
更新1:
需要考虑的一些事项:
Search API中的查询包含两部分:查询(使用Google风格的字符串搜索或使用JSON或XML结构化搜索表示)和查询选项。 StructuredQueryBuilder构建结构化搜索。 QueryOptionsBuilder仅构建了查询选项。
在ML 6.0-3中,REST API引入了对组合搜索的支持,组合搜索在单个请求中提供了两个部分。 Java API通过RawCombinedQueryDefinition类添加了对此类请求的支持。
ML7正在扩展结构化搜索,以减少或消除对结构化搜索的查询选项的需求。 StructuredQueryBuilder在ML7中得到增强,以支持结构化搜索的新功能。在ML7中,您将能够在StructuredQueryBuilder中完全编写上面的示例查询,而无需任何查询选项。
当我们将构建查询选项的代码与QueryOptionsBuilder以及JDOM或XOM进行比较时,很难在构建器中看到很多LOC好处。
您不必在字符串中对查询选项进行硬编码。为了分离关注点,您可以从文件或许多其他来源读取JSON或XML查询选项。 (请参阅http://docs.marklogic.com/javadoc/client/com/marklogic/client/io/marker/QueryOptionsReadHandle.html标记界面的实现。)
查询选项提供声明而不是可执行代码。并行将使用Spring配置文件而不是SPL文件。