2012-02-20 23 views
1

組み込みドキュメントで集約、最小、最大、合計and friendsを実行するにはどうすればよいですか?例えば埋め込みドキュメントのモンゴイド集合メソッド?

は、それらがかなり深く埋め込まれて地区が持っているすべてのイベントの平均コストを取得します。

District.schools.all.events.all.costs.avg(:value) 

明らかに機能しません。

District.avg('schools.events.costs.value') 

どちらもありません。 それは、このエラーメッセージが表示できます:

Mongo::OperationFailure: Database command 'group' failed: (errmsg: 'exception: reduce 
invoke failed: JS Error: TypeError: obj.schools 
has no properties reduce setup:1'; code: '9010'; ok: '0.0'). 

だから、可能であるのか、私は/機能を減らす自分のマップを記述する必要がありますか?

答えて

2

はい、MapReduceが機能します。また、カーソルを使用して照会結果を処理することもできます。 Like:

min = 99999999; 
max = -99999999; 
sum = 0; 
count = 0 
db.School.find({}).forEach(function(s) { 
    if (s.first.events.first.cost < min) 
     min = s.first.events.first.cost; 
    if (s.first.events.first.cost > max) 
     max = s.first.events.first.cost; 
    sum += s.first.events.first.cost; 
    ++count; 
}); 

ここで、最小値と最大値を持ち、合計とカウントの平均と平均を計算できるようになりました。

Mongodbには、クエリ言語で集計関数を直接計算する機能がありません。実際には、その文は完全に真ではありません。なぜなら、クエリによって返される結果の数を数えるcount()関数があり、group()関数があるからです。しかし、グループ機能はMapReduceによく似ており、断片化されたデータベースでは使用できません。グループ機能に興味がある場合は、http://www.mongodb.org/display/DOCS/Aggregation#Aggregation-Group

+0

を参照してください。 – Yeggeps

+0

Mongodbクエリ言語では、集計関数を計算する方法がありません。 MapReduceを書くことができます。または、例で示したように、クエリの戻り値を繰り返して値を計算することもできます。クエリ言語の詳細については、http://www.mongodb.org/display/DOCS/Advanced+Queries – dlaidlaw

+0

あなたの答えに感謝します。 – Yeggeps

関連する問題