2016-07-11 60 views
0

我有类似结构的一系列文件:和集合函数

<DOCUMENT> 
    <AMOUNTS> 
     <ELEMENT> 
      <AMOUNT>10.00</AMOUNT> 
      <INFO> 
       <CODE1>132</CODE1> 
       <CODE2>022</CODE2> 
      </INFO> 
     </ELEMENT> 
     <ELEMENT> 
      <AMOUNT>10.00</AMOUNT> 
      <INFO> 
       <CODE1>132</CODE1> 
       <CODE2>121</CODE2> 
      </INFO> 
     </ELEMENT> 
     <ELEMENT> 
      <AMOUNT>15.00</AMOUNT> 
      <INFO> 
       <CODE1>156</CODE1> 
       <CODE2>121</CODE2> 
      </INFO> 
     </ELEMENT>  
    </AMOUNTS> 
</DOCUMENT> 

我希望做的金额元素的各种款项,所以我已经把路径范围索引DOCUMENT/AMOUNTS/ELEMENT/AMOUNT希望使用sum-aggregate函数。但是,当使用cts:sum-aggregate函数时,如果文档中包含多个具有相同值的元素,则会发生问题。为了说明我所看到的问题,假设上面的XML存储在'/DOCS/DOC1.XML'uri。然后运行以下xQuery以获取文档中所有文档中所有文档的总和。我做的和在两种不同的方式和获得两种不同的结果:

(
    fn:sum(doc('/DOCS/DOC1.XML')/DOCUMENT/AMOUNTS/ELEMENT/AMOUNT), 
    cts:sum-aggregate(
     cts:path-reference("DOCUMENT/AMOUNTS/ELEMENT/AMOUNT"), 
     ("any"), 
     cts:document-query('/DOCS/DOC1.XML') 
) 
) 

fn:sum函数给出35和cts:sum-aggregate给25和聚集功能只包括值中的一个总和。

我觉得我做错了什么,但我无法弄清楚什么,有人可以为我揭示一些事情吗?

感谢

大卫

回答

1

是您的路径索引string型或数字(floatdouble等)类型?我不希望这可以根据字符串工作,但也许是这样,并且我看不到您传递选项来将该类型设置为数字(("any", "type=double"))。

字符串索引将相同(根据排序规则)值组合到一个条目中并递增条目的cts:frequency。如果sum-aggregate确实能够处理字符串索引(并且我没有在文档中看到任何其他的建议),这可以解释为什么重复值只计算一次。

2

在阅读完wst的回答之后,我确认了我的索引类型是十进制的,然后用选项稍微玩了一下,发现将“item-frequency”作为sum-aggregate函数的一个选项解决了我的问题。我并没有完全理解“汇总频率”和“碎片频率”之间与总和汇总函数之间的细微差别,但是下面的xQuery的工作原理就像我期望它导致两个汇总返回相同的值。

(
    fn:sum(doc('/DOCS/DOC1.XML')/DOCUMENT/AMOUNTS/ELEMENT/AMOUNT), 
    cts:sum-aggregate(
     cts:path-reference("DOCUMENT/AMOUNTS/ELEMENT/AMOUNT"), 
     ("item-frequency"), 
     cts:document-query('/DOCS/DOC1.XML') 
) 
) 
+0

有趣。 “项目频率”通常用于指示按索引中的项目数与数字片段(文档)的排序顺序。您是否尝试明确定义类型为“decimal”? – wst

+0

“片段频率”表示它计算特定值出现的片段数量,而不管它在该片段中发生了多少次。 “物品频率”本身就是真实的物品,所以是的,“物品频率”就是你想要的。是的,'fragment-frequency'是默认值:http://docs.marklogic.com/cts:aggregate – grtjn