【问题标题】:to extract each json property value from search:extracted从 search:extracted 中提取每个 json 属性值
【发布时间】:2020-11-11 13:43:10
【问题描述】:

我是 json 新手,所以需要一些帮助 我需要获取每个属性的 json 值,所以当我运行下面的代码时,我会得到文本中的 json。

let $doc := 
    for $sResult in ($result/search:result)
        let $uri := fn:data($sResult/@uri)
        let $docElements := $sResult/search:extracted 
        return xdmp:from-json-string($docElements/text())
return $doc

以文本格式输出:

[{"title":"xxxxxxxxx"}, {"species":"Animals"}]
[{"title":"yyyyyyyyy"}, {"species":"Animals"}]

所以我想得到类似$docElements/title/text()的东西,这样我就可以得到title json属性的值来做一些字符串操作,然后把它们放回json对象中以获得所需的输出。 所以,不知道该怎么做。

【问题讨论】:

    标签: json marklogic


    【解决方案1】:

    要修改文档的内容,请考虑使用search:resolve-nodes() 而不是search:search()

    如果要求是在返回客户端之前获取和修改 JSON 内容,一种方法是

    1. 将每个 JSON 节点转换为可变映射
    2. 使用 map:get() 和 map:put() 导航和修改地图
    3. 将修改后的地图转换回 JSON 节点

    这种方法的草图:

    let $modifiedDocs :=
        for $inputDoc in search:resolve-nodes(...query..)
        let $tempMap := xdmp:from-json($inputDoc)
        let $_ := ... navigate and modify the map ...
        return xdmp:to-json($tempMap)
    

    为了完整起见,如果目标是修改持久化的 JSON 文档,则迭代可能类似于以下草图:

     for $oldDoc in search:resolve-nodes(...query..)
     let $tempMap := xdmp:from-json($inputDoc)
     let $_ := ... navigate and modify the map ...
     let $newDoc := xdmp:to-json($tempMap)
     return xdmp:node-replace($oldDoc, $newDoc)
    

    希望对您有所帮助,

    【讨论】:

    • 感谢您的回复,但我需要提取每个 json 属性的值来突出显示搜索文本。另外,我不需要更改文档中的任何内容,我必须执行的字符串操作在 json 属性的文本上并发送到 UI 层,对 db 文档没有任何更改。
    • 请提出建议。
    猜你喜欢
    • 1970-01-01
    • 2022-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多