2016-04-06 27 views
2

我有一個數據庫與多個列。我試圖區分一列,所以我可以添加第二列的數字。我正在創建一個新的集合(表格)。 例如:不同的列在MongoDB中使用JavaScript

states  race race_1 geo_type 
Alabama 1  3  state 
Alabama 4  1  state 
Alabama 4  1  state 
Alaska  5  1  state 
Alaska  2  1  state 

所以輸出應該是。

states  race race_1 geo_type 
Alabama 9  5  state 
Alaska  7  2  state 

我使用Javascript來運行該任務。 這是我到目前爲止有:

db.race_collection.distinct('states').forEach(function(state_lookup){ 
var race_sum = 0; 

db.race_collection.find({'states': state_lookup}).forEach(function(doc){ 
    if (doc['race']) { 
    race_sum = race_sum + doc['race']; 
    } 
    if (doc['race'] != null) 
     db.indicator_collection.insert({ 
     'race': race_sum, 
      'state': state_lookup 
}) 
}) 
}) 

我試圖尋找在Javascript的答案,這一點,但找不到任何接近。我沒有移動到「race_1」還因爲我甚至沒有得到「比賽」加起來。如果需要,你可以撕開我的代碼。重要的是我使用Javascript來解決這個問題。 在此先感謝。

回答

1

您可以使用聚合框架來獲得您想要的結果。運行以下聚合管道,該管道將使用states密鑰對所有文檔進行分組,使用$group並計算其他字段的總計,其中$sum運算符。分組中的其他字段geo_type的選擇是通過運算符$first完成的。

另一個流水線階段$project將取代_id$group管道返回,並與其他字段一起增加了新的領域。

通過聚合管道返回的文件會被寫入使用$out運營商的另一個集合:

db.race_collection.aggregate([ 
    { 
     "$group": { 
      "_id": "$states", 
      "race": { "$sum": "$race" }, 
      "race_1": { "$sum": "$race_1" }, 
      "geo_type": { "$first": "$geo_type" } 
     } 
    }, 
    { 
     "$project": { 
      "_id": 0, 
      "state": "$_id", 
      "race": 1, 
      "race_1": 1, 
      "geo_type": 1 
     } 
    }, 
    { "$out": "indicator_collection" } 
]) 
+0

這個工作,易於操作。我之前沒有使用聚合。但是,如果要使用**「states」**替代列名的**「_ id」**,該怎麼辦?它給出的錯誤'狀態'必須定義爲對象中的表達式。 **「_id」**是必要的。 –

+0

在這種情況下,你需要在''''''project''(https://docs.mongodb.org/manual/reference/operator/aggregation/project/#pipe._S_project) $ out'管道,這將替換'_id'並添加新的字段。檢查我的編輯實施。 – chridam

相關問題