sql - 来自嵌套 JSON 数组的 MarkLogic TDE XPath 值
问题描述
尽管JSON 字符串数组中的 MarkLogic TDE Xpath 值有所帮助,但我仍然难以访问嵌套 JSON 数组中的值。
这是一个带有嵌套数组的示例 JSON 文档:
{
"instance": {
"ID": 7,
"groups": [
{
"type": "parent",
"items": [
{
"type": "child",
"items": [
{
"payload": {
"name": "Frank Lee",
"age": 22
}
},
{
"payload": {
"name": "Sal Lee",
"age": 21
}
},
{
"payload": {
"name": "Ro Mance",
"age": 27
}
}
]
}
]
}
]
}
}
使用以下模板,我可以提供由实例 ID 和组数组类型名称组成的 SQL 视图:
xquery version "1.0-ml";
import module namespace tde = "http://marklogic.com/xdmp/tde"
at "/MarkLogic/tde.xqy";
let $nested-json :=
<template xmlns="http://marklogic.com/xdmp/tde">
<context>/instance/array-node()/groups</context>
<enabled>true</enabled>
<rows>
<row>
<schema-name>JSON_Example</schema-name>
<view-name>nested_json</view-name>
<columns>
<column>
<name>instance_ID</name>
<scalar-type>int</scalar-type>
<val>../../ID</val>
</column>
<column>
<name>group_type</name>
<scalar-type>string</scalar-type>
<val>type/data()</val>
<nullable>true</nullable>
<invalid-values>ignore</invalid-values>
</column>
</columns>
</row>
</rows>
</template>
(:return tde:validate($nested-json):)
return tde:template-insert("/nested_json.xml", $nested-json)
但是,尝试在嵌套项数组中创建值的视图,例如有效负载名称,是非常具有挑战性的。此模板不起作用:
xquery version "1.0-ml";
import module namespace tde = "http://marklogic.com/xdmp/tde"
at "/MarkLogic/tde.xqy";
let $nested-json :=
<template xmlns="http://marklogic.com/xdmp/tde">
<context>/instance/array-node()/groups/array-node()/items/array-node()/item/payload</context>
<enabled>true</enabled>
<rows>
<row>
<schema-name>JSON_Example</schema-name>
<view-name>nested_json_array</view-name>
<columns>
<column>
<name>instance_ID</name>
<scalar-type>int</scalar-type>
<val>../../../../ID</val>
</column>
<column>
<name>group_type</name>
<scalar-type>string</scalar-type>
<val>name</val>
<nullable>true</nullable>
<invalid-values>ignore</invalid-values>
</column>
</columns>
</row>
</rows>
</template>
(:return tde:validate($nested-json):)
return tde:template-insert("/nested_json_array.xml", $nested-json)
有任何想法吗?
解决方案
问题是 XPath 在 MarkLogic 中处理 JSON 的方式可能会导致混淆。某些级别会被隐式跳过,而您不会注意到它。它有助于理解完整的 JSON 树在 XPath 术语中的样子。正确和最明确的上下文路径是:
<context>/object-node()/object-node('instance')/array-node('groups')/object-node()/array-node('items')/object-node()/array-node('item')/object-node()/object-node('payload')</context>
这表明你必须达到 7 级才能达到祖先instance
:
<val>../../../../../../../ID</val>
这不会增加可读性,因此作为替代方案,您可以利用ancestor
轴并简化 XPath 表达式。所以使用它作为上下文:
<context>/instance/groups/items/item/payload</context>
这要达到ID
:
<val>ancestor::instance/ID</val>
!
推荐阅读
- amazon-web-services - 无法使用 codedeploy 在 ec2 实例上部署代码
- bentley-itwin - asp.net 核心 webapp - OAUTH2 授权 - 401 错误
- python - 将列表列表转换为元组列表的一种被遗忘的简单方法:[[1,2], [3,4]] -> [(1,2), (3,4)]
- flutter - 在网络中拦截请求 - 应用 WebView 中的 Flutter
- android - 我在 Android 上构建的计算器有问题
- c - 递减 x 不会递减它的值,它只会一直保持在那里,直到检测到堆栈粉碎 --- C
- python - 使用python的音频亵渎过滤器
- javascript - 在客户端检索由 firebase 分配的用户 ID 令牌时出错
- node.js - 站点文件上传到服务器后,相对路径不起作用
- java - 从 Guava 缓存中使其无效时,我是否应该调用本机 C++ 对象的析构函数?