【问题标题】:Using DHF to harmonize into denormalised entities使用 DHF 协调成非规范化实体
【发布时间】:2019-01-08 16:08:35
【问题描述】:

我们正在使用 MarkLogic 9.0.5 和 DHF 3.0,并且我们正在尝试将多个源文档协调为非规范化形式。但是,我们无法正确获取 xml 表单。

假设我们有一份家庭源文件,家庭成员各一份。现在,我们要生成一个类似这样的协调实体:

<envelope>
<header></header>
<instance>
   <family>
     <name>Paulsen</name>
     <family-member>
         <name>John</name>
         <age>54</age>
     </family-member>
     <family-member>
         <name>Clarice</name>
         <age>38</age>
     </family-member>
   </family>
</instance>
</envelope>

但是,新的 DHF 结构迫使我们使用 json 对象映射来生成代码,但是我们将数据放入对象中的任何方式都不会像上面那样将其取出。例如:

declare function plugin:extract-instance-family
$source as node()?,
$options as map:map
) as map:map

let $name := get-family-name()
let $family-member := (<family-member>
                         <name>get-name()</name>
                         <age>get-age()</age>
                       </family-member>,
                       <family-member>
                         <name>get-name()</name>
                         <age>get-age()</age>
                       </family-member>)

let $model := 
  json:object()
    =>map:with('name', $name)
        =>map:with('family-member', '$family-member')

    return $model
};

会产生一些 xml,例如:

<envelope>
<header></header>
<instance>
   <family>
     <name>Paulsen</name>
     <family-member>
         <family-member>
             <name>John</name>
             <age>54</age>
         </family-member>
     </family-member>
     <family-member>
        <family-member>
           <name>Clarice</name>
           <age>38</age>
         </family-member>
     </family-member>
</instance>
</envelope>

这包含每个族节点两次。有关如何解决此问题的任何建议?

PS 我也尝试过将嵌套的 json 对象作为参数传递,但显然这会导致 dhf 流中的错误:

let $family-member := json-object()
                      => map:with('family-member', 'stuff')

【问题讨论】:

    标签: marklogic marklogic-dhf


    【解决方案1】:

    这种行为背后是有原因的。这遵循 MarkLogic 实体服务中使用的模式。您可以在此处阅读有关使用实体建模的好处的更多信息:http://docs.marklogic.com/guide/entity-services/intro#id_23284

    调整代码可能会有所帮助,以免元素名称发生冲突,并清楚地表明第二层描述的是实体类型,与第一层描述顶级实体的属性名称不同。

    例如,

    declare function plugin:extract-instance-family-type
      $source as node()?,
      $options as map:map
    ) as map:map
    
    let $name := get-family-name()
    let $family-member := (<family-member-type>
                             <name>get-name()</name>
                             <age>get-age()</age>
                           </family-member>,
                           <family-member>
                             <name>get-name()</name>
                             <age>get-age()</age>
                           </family-member-type>)
    
    let $model := 
      json:object()
        =>map:with('name', $name)
            =>map:with('family-member', '$family-member')
    
        return $model
    };
    

    在这种情况下,您可以考虑将数据提取到 Java 程序的情况。顶级family-type 实体将映射到Family Java 类和该类的family-member 元素familyMember 字段,最后,family-member-type 将映射到FamilyMember 类及其相关字段。

    另外,如果您打算将数据作为 JSON 来使用,我会更进一步,并建议使用制作实体类型 TitleCase 和属性 camelCase 的约定。 (家庭类型、家庭成员、家庭成员类型)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-04
      • 2018-02-05
      • 2016-05-01
      • 2017-06-09
      • 2013-08-21
      • 2016-05-13
      • 2018-06-06
      • 2023-03-06
      相关资源
      最近更新 更多