尝试插入数组节点对象 XDMP-CHILDDUPNAME 时出错?

问题描述 投票:0回答:1

我已经阅读了有关使用 XQuery 操作 JSON 文档以及使用 xdmp:insert-xxx 添加节点和向数组添加元素的所有文档,但我正在尝试使用现有数组的值数组创建一个新对象,并且可以好像没明白。

我想将以下对象添加到我的 json 文档的根节点。

{
 "A" : [ "B", "C" ]
}

当我尝试时,

xdmp:node-insert-child( $doc/object-node(), object-node{ "ConfiscatedItems" : array-node{ "calculator", "welding iron" } }/ConfiscatedItems )

我收到 XDMP-CHILDDUPNAME 对象节点不能有两个同名的子节点

我的最终目标是说我是否有一个类似的文档;

{
   "f": "g",
   "h": 1,
   "q": [ 1, 2 ]
}

我希望它看起来像;

{
   "f": "g",
   "h": 1,
   "q": [ 1, 2 ],
   "A": [ "B", "C" ]
}

我可以通过创建一个名为“A”的新文本节点并使用

xdmp:node-replace()
和数组来分两步完成此操作,但我想一步完成此操作,而不是两步。这主要是因为我正在创建使用
xdmp:value()
执行任务的通用代码,这意味着我对事务有限制,并且无法在同一事务中分两步执行此操作。 有人可以帮忙吗?

xquery marklogic
1个回答
0
投票

当您拥有使用数组节点寻址命名属性的 XPath

/ConfiscatedItems
时,它将返回数组项的序列。这些项目将具有相同的名称,并会导致(如果您不明白发生了什么,则会令人困惑)错误消息XDMP-CHILDDUPNAME

您想要返回数组节点,而不是数组中的项目。因此,将您的 XPath 更改为:

/ConfiscatedItems

至:

/array-node("ConfiscatedItems")

或者,匹配您发布的示例 JSON

/array-node("A")

© www.soinside.com 2019 - 2024. All rights reserved.