2012-09-30 43 views
1

鑑於下方顯示& MongoDB的外殼版本的架構:2.0.4:

我會如何的印象數組中的計數的項目數?

我想我必須做一個Map Reduce,這似乎有點複雜,我認爲Count函數會做到這一點。
有人可以證明這一點嗎?MongoDB的匯聚型數組項

Mongo Schema

+1

'engage.impressions.length',但我很確定這不是你想要的,但基本上你在問什麼。 –

+1

假設您想要一個映射'function(doc){return doc.impressions.length}'的函數,您最好的辦法就是擁有一個'count.impressions'屬性,您可以在更新印象的同時進行更新。 –

+0

db.engagement.find({company_name:「me」},{impressions:1})。length()失敗 – CAM

回答

1

計數的一個簡單的例子是:

var count = 0; 
db.engagement.find({company_name: "me"},{impressions:1}).forEach(
    function (doc) { 
     count += doc.impressions.length; 
    } 
) 
print("Impressions: " + count); 

如果你有大量的文件要處理,你會得到更好的維護算作一個明確的領域。您可以在推送到展示次數數組時更新計數,也可以根據需要使用incremental MapReduce重新計算更新的文檔。

+0

我想推進這個,也許我想按日期範圍計數?我應該趕上時間鍵,並檢查它是否在範圍內,只有在範圍內才增加計數器? @stennie謝謝你。 – CAM

+0

或者我應該打開另一個問題? – CAM

+1

@CAM:如果您想更熟悉操作,可以考慮在MongoDB 2.2中使用新的[Aggregation Framework](http://docs.mongodb.org/manual/applications/aggregation/)。它有內置的運營商,例如[$ group](http://docs.mongodb.org/manual/reference/aggregation/group/#_S_group),它可以讓你做總和。可能更好,如果你可以用你想要實現「高級」查詢的完整例子來打開一個新問題。注意:如果你的時間字段是日期而不是字符串,這也會很有幫助。 – Stennie