0

参考記事で答えを見つけましたが、私は MongoDB の初心者であり、MongoDB のドキュメントは初心者向けに十分に説明されていません。クリスティーナの本も読んでいるので、宿題をしています。この投稿は、従来の方法ではなく、これを理解しようとしている他のユーザーにも役立つ可能性があると思いました。問題があり、誰かがコードサンプルを投稿しましたが、何が起こったのか本当に理解していません。

そうは言っても、以下にリストした相互に関連するいくつかのことで本当に苦労しています。この問題について別の良い質問と回答を見つけましたが、それは単なるコードであり、mongoの初心者には十分に説明されていません. また、コードは機能しませんでした (http://stackoverflow.com/questions/6414312/fastest-way-to-get-the-average-of-a-specific-field-in-mongodb)。:/

次のようなドキュメントがあります。

{ "_id" : ObjectId("4fc7e9138c8b0f0d5200000f"), "memtotal" : 996, "swaptotal" : 2015, "swapfree" : 2015, "memfree" : 464, "time" : 1338501393 }
{ "_id" : ObjectId("4fc7e9518c8b0f0d52000015"), "memtotal" : 996, "swaptotal" : 2015, "swapfree" : 2015, "memfree" : 464, "time" : 1338501455 }
{ "_id" : ObjectId("4fc7e98f8c8b0f0d5200001b"), "memtotal" : 996, "swaptotal" : 2015, "swapfree" : 2015, "memfree" : 463, "time" : 1338501517 }
{ "_id" : ObjectId("4fc7e9cd8c8b0f0d52000021"), "memtotal" : 996, "swaptotal" : 2015, "swapfree" : 2015, "memfree" : 464, "time" : 1338501579 }
{ "_id" : ObjectId("4fc7ea0b8c8b0f0d52000027"), "memtotal" : 996, "swaptotal" : 2015, "swapfree" : 2015, "memfree" : 446, "time" : 1338501641 }
{ "_id" : ObjectId("4fc7ea498c8b0f0d5200002d"), "memtotal" : 996, "swaptotal" : 2015, "swapfree" : 2015, "memfree" : 424, "time" : 1338501703 }

すべての memfree 要素を取得してから、平均を計算しようとしています。上記の参照リンクに基づいてコードをコピーして貼り付けようとしましたが、最初はある程度意味があり、次に実際には機能しませんでした。

行 2) 最初の行は理にかなっており、かなり自明です。 行 3) 2 行目のカウント: 0、合計: 0 - これらは true/false スイッチですか? 4 行目) これは mapReduce() 関数から同じ reduce を呼び出していますか? doc と out はキーワードですか、それとも勝手に定義していますか? その他) とにかくコードが失敗しました。なぜですか?

最後のサブ質問: mapReduce を使用して同じことを行うことはできますか?また、平均を計算する必要があるシャードがある場合、これに対してグループに対して mapReduce 関数を使用するのはなぜですか?

4

1 に答える 1

3

これは主にグループ関数のドキュメントでカバーされています。

それを分解しましょう:

db.test.group(
- テスト コレクションとグループの結果に対してこのクエリを実行します。
{ cond: {"status": 1}
- この条件を満たすドキュメントのみを気にするので、結果をフィルタリングします。
, initial: {count: 0, total:0}
- count と total の 2 つの変数を追跡します。出力ドキュメントでそれらをゼロに初期化しましょう。
, reduce: function(doc, out){ out.count++; out.total += doc.views }
- 条件を満たしたすべてのドキュメントに対して、この関数を適用します (これにより、カウントが 1 増加し、ドキュメント 'out' 内のビューの数だけ合計が増加します)
, finalize: function(out){ out.avg = out.total / out.count }
- すべてのドキュメントを確認したら、この関数を実行します。合計ビューをドキュメント数で割って平均ビューを計算し、それを「アウト」ドキュメントに入れます。
} );

key特定のフィールドでグループ化する場合に必要となる、参照された例にある必要のない別の行もあります。それがなければ、コレクション全体の平均を取得します。これにより、「キー」の個別の値ごとに個別の平均が得られます。

はい、reduce は、map/reduce で記述できる関数と同じです。「グループ」の制限は、条件に一致する「ドキュメント」のみを取得することです。map reduce では、「map」関数を使用して、入力ドキュメントに基づいて任意のドキュメントを発行できます。

どのバージョンを使用していたかを尋ねた理由は、開発リリース (2.1) で現在利用可能であり、本番用に 2.2 でリリースされる予定の集約フレームワークであり、MongoDB コレクションでの集約クエリの実行が大幅に簡素化されます。

うまくいけば、これは少し役に立ちました。

于 2012-06-04T00:16:19.677 に答える