javascript—在集合中的所有文档中查找给定json属性的不同值

6ioyuze2  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(322)

给定文档中的json属性,我需要获取集合中所有文档中该属性的所有不同值。这是否可以使用marklogic java客户机api实现?
例如,我有3个类型为“mydocument”的文档,属性为“myproperty”-
mydocument1.json文件

{
    "myProperty":"val1"
}

mydocument2.json文件

{
    "myProperty":"val1"
}

mydocument3.json文件

{
    "myProperty":"val2"
}

我想搜索“myproperty”的所有不同值,即结果应该是“val1”和“val2”。
如果我能用这些不同的值对文档进行分组。例如。,

{
    "val1": [
       {
           "myProperty":"val1"
       },
       {
           "myProperty":"val1"
       }
    ],
    "val2": [
       {
           "myProperty":"val2"
       }
    ]
}

我很感激你的帮助和帮助。提前谢谢!
更新:
我可以使用qconsole得到我想要的结果,但是使用xquery。我就是这么做的-

xquery version "1.0-ml";
import module namespace search = "http://marklogic.com/appservices/search" at "/MarkLogic/appservices/search/search.xqy";

    let $options :=
        <options xmlns="http://marklogic.com/appservices/search">
            <values name="myProperty">
                <range type="string" facet="true">
                    <json-property>myProperty</json-property>
                </range>
            </values>                
        </options>

    return search:values("myProperty", $options)

我得到的结果是-

<search:values-response name="myProperty" type="xs:string" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:search="http://marklogic.com/appservices/search">
    <search:distinct-value frequency="2">val1</search:distinct-value>
    <search:distinct-value frequency="1">val2</search:distinct-value>
</search:values>

现在我需要使用java客户机api来实现这一点。

35g0bw71

35g0bw711#

只是为了突出java应用程序中的marklogic javascript api:
在搜索json属性或路径上创建元素或路径范围索引。
构造一个服务器端javascript以利用marklogic performant搜索引擎(它可以在数百万个文档中以秒为单位返回复杂的搜索结果):

String js = 
    "let result = [];"
    + "for (const id of cts.values(cts.elementReference(xs.QName(\"myProperty\")))) {"
    + "result.push({'propertyGroup': id})"
    + "}"          
    + "result;";

调用java eval调用,迭代并返回搜索结果:

ServerEvaluationCall serverEvalCall = markLogicClient.newServerEval().javascript(js);

    EvalResultIterator evalIterate = serverEvalCall.eval();

    EvalResult evalResult = evalIterate.next();

    JacksonHandle jHandle = new JacksonHandle();

当搜索条件更复杂时,您可以构建开箱即用的查询选项| | optic | | jsearch api,全部使用marklogic java api方言。

0sgqnhkj

0sgqnhkj2#

最简单的解决方案是对该属性使用范围索引,以便使用以下函数从词典中选择值:https://docs.marklogic.com/cts:值
否则,您可以尝试暴力方法。您可以遍历每个文档,选择属性的值并放入Map中,然后从Map中报告键。
如果您有一个具有该json属性的文档集合,那么在单个查询中收集数据时可能会遇到超时或扩展树缓存错误。您可以运行corb作业,将该属性的值写入输出文件,并使用该值应用export file sort选项 ascending|distinct

相关问题