Warm tip: This article is reproduced from serverfault.com, please click

其他-XQuery:创建 map数组

(其他 - XQuery: create array of maps)

发布于 2020-12-04 16:05:45

我不明白如何在Xquery中动态创建 map数组,最后应序列化为JSON:

我可以像这样创建一个简单/静态的 map数组

let $array := [map{"id": "4711"}, map{"id": "4712"}]

我可以添加另一张这样的 map:

let $array := array:append($array, map {"id": "4713"})

使用以下

return 
 serialize($array, 
        <output:serialization-parameters>
            <output:method>json</output:method>
        </output:serialization-parameters>)

结果[{"id":"4711"},{"id":"4712"},{"id":"4713"}]对我来说是完美的JSON。

但是我可以根据序列将任意数量的映射添加到此数组,如下所示:

let $mylist := ("4714", "4715")

我想要的结果是这样的:

[{"id":"4711"},{"id":"4712"},{"id":"4713"},{"id":"4714"},{"id":"475"}]

我正在尝试通过以下方法实现这一目标:

let $array := array:append($array, 
    for $n in $mylist
    return map {"id": $n}
)  

但这返回结果:

[{"id":"4711"},{"id":"4712"},{"id":"4713"},[{"id":"4714"},{"id":"4715"}]]

因此,显然for循环会创建另一个数组,并将其追加到现有数组中。我该如何避免呢?

Questioner
heinbloed
Viewed
11
Michael Kay 2020-12-05 02:26:57

我认为以下应该这样做:

let $mylist := ("4714", "4715")
return array{ $mylist ! map{'id': .} }

在我看来,使用array{}特殊语法而不只是一个函数有点遗憾

你也可以使用

array:join( $mylist ! [map{'id': .}] )