使用Xquery在Marklogic中实现信封模式?

时间:2018-01-16 16:03:21

标签: xquery marklogic

我想在我的json数据中实现信封模式。我的数据看起来像这样

{
"id": "1", 
"first_name": "Shawn", 
"last_name": "Grant", 
"email": "sgrant0@51.la", 
"country": "Liberia", 
"ip_address": "37.194.161.124"
}

我想像这样实现信封模式

{
"envelope": { 
 "Code" : "2023"
}, 
"source": {
"id": "1", 
"first_name": "Shawn", 
"last_name": "Grant", 
"email": "sgrant0@51.la", 
"country": "Liberia", 
"ip_address": "37.194.161.124"
}
}

我尝试了下面的xquery代码,但它没有顺利

xquery version "1.0-ml";
let $doc := fn:collection("transform")
for $i in $doc 
let $object := json:object() --> I am struck here because i dont know how to create a envelope header
let $source := $i
return $source

感谢任何帮助

由于

2 个答案:

答案 0 :(得分:2)

如果您习惯使用XML,JSON节点映射到MarkLogic中的XQuery数据模型的方式并不总是直观的。通常,直接使用对象节点可以减少混淆:

for $doc in fn:collection("transform")
let $source := $doc/object-node()
let $envelope := 
  object-node { 
    "Code" : "2023"
  } 
return object-node {
  "envelope" : $envelope,
  "source" : $source
}

答案 1 :(得分:1)

我喜欢wst所描述的使用json节点构造函数的方法,但有时您需要动态添加属性,这些构造函数可能很复杂。您也可以直接使用json:object()map:map()map:map()的特化,并使用xdmp:to-json将其转换为json节点:

for $doc in fn:collection('transform')
return xdmp:to-json(map:new((
  map:entry("envelope", map:new((
    map:entry("Code", 2023)
  ))),
  map:entry("source", $doc)
)))

HTH!