2016-09-27 75 views
0

嵌套數組我有包含像數據文檔的CouchDB數據庫:如何獲得總和,平均值等從數字的文檔的CouchDB

"field1": "text", 
"field2": "text", 
"field3":[14 54 23 24,25,26,23,19,17 etc.] 
etc. 

我試圖做一個地圖降低獲得數據庫中所有field3值的平均值。

我做了一個圖如下:

function(doc) { 
if(doc.field3){ 
emit(null,doc.field3); 
} 
} 

和減少:

function (keys, values, rereduce) { 
if (rereduce){ 
return sum(values); 
} else { 
return values.length; 
} 
} 

或者乾脆:

_sum 

後者給出了一個數字範圍,這似乎是數組中相同數字的總和。

有上了訪問數字數組,但沒有完整的答案Cloudant網站的例子,在現階段,我無法找到它。

我也調查了CouchDB 2.0.0上的新'mango'查詢系統,這個系統設置起來要容易得多,但我沒有在文檔中看到用它進行計算的任何方式。

編輯

請允許我冒昧地加入到這個問題,也許有一個很好的例子。

我使用Mockaroo生成數據,並發現了一個替代方法來生成這個數據,這是更現實的,因爲我可以改變數據的更多方面。

然而,這導致瞭如下修改我的數組:

"field3":[{"item": 44}, {"item":23}, {"item": 36}, etc.] 

使用@Alexis提供了成功的地圖我試圖得到它讀取該數據。例如:

function(doc) { 
if(doc.field3[0].item >0){ 
if (doc.field3) { 
    if (Array.isArray(doc.field3)) 
     for (var n in doc.field3) 
      emit(null, doc.field3[n].item); 
} 
} 
} 

我試圖上面的代碼的許多變化,增加或.item[]添加/移除的if語句,沒有成功。

我將不勝感激與陣列的這種變化有所幫助,如果可能的話。

設置的JavaScript的map/reduce是不容易的某些原因。 我已經通過了很多免費的在線JavaScript學習課程,嘗試和提高我的CouchDB能力,但沒有取得太大的成功。 有沒有更好的方式來學習寫作地圖的正確JavaScript的黑暗藝術減少?

非常感謝幫助。

+0

你減少是_count相當於,不** _ **和那 –

回答

1

既然你想在字段3至極全球平均水平是一個數組,我會先映射所有領域的3個值,並減少他們。

地圖功能:

function(doc) { 
    if (doc.field3) { 
     if (Array.isArray(doc.field3)) 
      for (var n in doc.field3) 
       emit(null, doc.field3[n]); 
    } 
} 

Reduce函數:

function(keys, values, rereduce) { 
    return sum(values)/values.length; 
} 

新編輯意味着新的答案!

//Your function 

function(doc) { 
    if (doc.field3[0].item > 0) { 
     if (doc.field3) { 
      if (Array.isArray(doc.field3)) 
       for (var n in doc.field3) 
        emit(null, doc.field3[n].item); 
     } 
    } 
} 

//Fixed one 

function(doc){ 
    //We check if the field3 is an array and we check if its length is 
    //true. In javascript 0==false, any number ==true and the length can't 
    // be negative so we are in business. 
    if(Array.isArray(doc.field3) && doc.field3.length){ 
     //Your array contains many object. So we can simply iterate through them 
     for(var i=0;i<doc.field3.length;i++){ 
      //at this point, doc.field3[i] is one of the object. Eg: {"item":44} 
      emit(null,doc.field3[i].item); 
     } 
    } 
} 
+0

工作完全@Alexis。如果您允許我自由地添加我的問題,請參閱上面的修改。 – jlb333333

+0

@ jlb333333如果你想更好地理解你的函數,你可以使用一個調試器,讓你可以實時看到變量。爲此,請查詢您的數據庫並將查詢限制爲10個文檔,以免它不太重。然後將數據轉換爲JSON並開始在JavaScript環境中工作。 視圖中的JavaScript非常簡單,但很難調試。通常,您只需要知道如何遍歷對象,數組和比較/驗證值。 –