2012-12-18 87 views
0

這是我收集的結構:mongodb查詢與組()?

coll{ 
id:..., 
fieldA:{ 
    fieldA1:[ 
     { 
      ... 
     } 
    ], 
    fieldA2:[ 
     { 
      text: "ciao", 
     }, 
     { 
      text: "hello", 
     }, 
    ] 
} 
} 

我想提取我的集合中的所有fieldA2但如果fieldA2two or more times我只想要one顯示。

我試試這個

Db.runCommand({distinct:’coll’,key:’fieldA.fieldA2.text’}) 

,但沒有。這將返回集合中的所有filedA1

所以我儘量

db.coll.group({ 

       key: { 'fieldA.fieldA2.text': 1 }, 

       cond: { } }, 

       reduce: function (curr, result) { }, 

       initial: { } 

      }) 

但這返回一個空數組...

我怎麼能做到這一點,看到的執行時間?謝謝你非常匹配...

+0

'fieldA'只顯示'fieldA1'和3個點的內容,但是在你的組中,你顯示你希望在該字段內的'text'的子字段上進行分組。 'fieldA1'的真正結構是什麼? – Sammaye

+0

您可以爲示例輸入添加所需的輸出嗎? –

+0

Sammaye:對不起..我希望在fieldA2.text上分組 – alessio1985

回答

1

既然你運行的是2.0.4(我推薦升級),你必須通過MR運行(我想,也許有更好的方法)。喜歡的東西:

map = function(){ 
    for(i in this.fieldA.fieldA2){ 
     emit(this.fieldA.fieldA2[i].text, 1); 
     // emit per text value so that this will group unique text values 
    } 
} 

reduce = function(values){ 
    // Now lets just do a simple count of how many times that text value was seen 
    var count = 0; 

    for (index in values) { 
     count += values[index]; 
    } 

    return count; 
} 

便會給你的文檔的集合,其中_idfieldA2獨特text值和value場次數是出現我的收藏量。

這又是一個草案,未經測試。

+0

謝謝你的答案..我嘗試你的代碼,但出現跟隨錯誤:映射減少失敗:「斷言」:「內存映射/減少太多的數據」, 「assertionCode」:13604, 「errmsg」:「db斷言失敗」, 「ok」:0 } – alessio1985

+0

@ alessio1985這很糟糕,關於stennies的回答呢?我知道你以前嘗試過截然不同,但我確信它應該可以工作,如果你嘗試他的例子 – Sammaye

+0

謝謝你非常符合Sammaye ..你的代碼完美工作。 – alessio1985

0

我想答案是不是一個簡單的地圖/減少..如果你只是想不同的值加上執行時間,下面應該工作:

var startTime = new Date() 
var values = db.coll.distinct('fieldA.fieldA2.text'); 
var endTime = new Date(); 

print("Took " + (endTime - startTime) + " ms"); 

這將導致values數組列表不同fieldA.fieldA2.text值:

[ "ciao", "hello", "yo", "sayonara" ] 

而且報告的執行時間:

Took 2 ms