2016-07-11 95 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