2013-04-26 82 views
0

我有一些文件看起來像這樣:聚合函數可以與字段名稱中的變量一起使用嗎?

{ 
    (...stuff...) 
    something: { 
     first: { 
      0: 3, 
      1: 5, 
      2: 2 
     }, 
     second: { 
      0: 1, 
      1: 9, 
      2: 7 
     } 
    } 
} 

對於這個問題簡單起見,我假設我$match只打這一個文件。我想要做的是,在aggregate命令,加起來0 S,並添加了1 S,並添加了2 S,這樣我就可以產生這樣的:

something.0: 4 (something.first.0 + something.second.0) 
something.1: 14 (something.first.1 + something.second.1) 
something.2: 9 (something.first.2 + something.second.2) 

這是可以完成的事情,還是我需要更改我的文檔模式以重新排列嵌套文檔,使所有0都在一起等等?

回答

0

如果你知道你想要的總結,你可以使用聚合框架MongoDB中2.2+陣列的名稱,並與$add operator的投影:

db.something.aggregate(
    { $project: { 
     something: { 
      0: { $add: [ "$something.first.0", "$something.second.0" ] }, 
      1: { $add: [ "$something.first.1", "$something.second.1" ] }, 
      2: { $add: [ "$something.first.2", "$something.second.2" ] } 
     } 
    }} 
) 

輸出示例:

{ 
    "result" : [ 
     { 
      "_id" : ObjectId("517ae4914bc9ade96ca6402d"), 
      "something" : { 
       "0" : 4, 
       "1" : 14, 
       "2" : 9 
      } 
     } 
    ], 
    "ok" : 1 
} 

如果您不知道名稱(例如,您正在使用試圖在文檔中添加每個數組元素的第0個元素),則需要使用MapReduce或在應用程序代碼中實現邏輯。

+0

我希望有一個通配符或某些東西,這樣我就不會有最長的命令,當我將所有24個字段添加到子文檔 – DiMono 2013-04-30 12:28:25

+0

@DiMono:根據我在答案結尾的評論,那麼MapReduce或應用程序邏輯可能是更合適的解決方案。原始問題只提到元素0/1/2,但如果您有24個字段,則聚合框架將變得更加冗長。如果您只是在單個文檔(或少量文檔)上進行這種計算,則只需在應用程序邏輯中迭代文檔就可能是最有效的。如果您需要針對一系列文檔運行計算,那將有利於使用MapReduce。 – Stennie 2013-05-01 13:34:44

+0

當然,您可以始終以編程方式構建Aggregation Framework管道,因此您不必自己寫出24個字段。對於單個文檔來說這仍然是過分的。根據您需要運行此查詢的頻率,另一個需要考慮的選項是[預彙總](http://docs.mongodb.org/manual/use-cases/pre-aggregated-reports/),以便您可以調整總和爲您的嵌套文檔設置相同的更新值。 – Stennie 2013-05-01 13:38:19

相關問題