1

埋め込まれたドキュメントでaggregate、min、max、sum 、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').

それで、それは可能ですか、それとも独自のmap / reduce関数を書く必要がありますか?

4

1 に答える 1

2

はい、MapReduce は動作します。カーソルを使用してクエリ結果を処理することもできます。お気に入り:

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 を参照してください。

于 2012-02-20T19:44:32.837 に答える