MongoDB集計グループの操作ガイド
MongoDBアグリゲーション
MongoDB aggregate は、主にデータを加工して (統計的な平均や合計など)、計算したデータの結果を返すために使います。SQL 文の count(*) のようなものですね。
基本的な構文は以下の通りです。
db.collection.aggregate( [ <stage1>, <stage2>, ... ])
現在、mycolコレクションには以下のデータが登録されています。
{ "_id" : 1, "name" : "tom", "sex" : "male", "score" : 100, "age" : 34 }.
{ "_id" : 2, "name" : "jeke", "sex" : "male", "score" : 90, "age" : 24 }.
{ "_id" : 3, "name" : "kite", "sex" : "female", "score" : 40, "age" : 36 }.
{ "_id" : 4, "name" : "herry", "sex" : "男性", "score" : 90, "age" : 56 }.
{ "_id" : 5, "name" : "marry", "sex" : "female", "score" : 70, "age" : 18 }.
{ "_id" : 6, "name" : "john", "sex" : "male", "score" : 100, "age" : 31 }.
1. $sumは合計を計算します。
Sql:
select sex,count(*) frommycol group by sex
MongoDbです。
db.mycol.aggregate([{$group: {_id: '$sex', personCount: {$sum: 1}}])
画像
Sql:
select sex,sum(score) totalScore frommycol group by sex
MongoDbです。
db.mycol.aggregate([{$group: {_id: '$sex', totalScore: {$sum: '$score'}}}])
画像
2. $avg 平均値を計算する
Sql:
select sex,avg(score) avgScore frommycol group by sex
Mongodb
db.mycol.aggregate([{$group: {_id: '$sex', avgScore: {$avg: '$score'}}}])
画像
3, $max 最大値に対応するコレクション内のすべてのドキュメントを取得します。
Sql: {コード
Mongodb
select sex,max(score) maxScore frommycol group by sex
画像
4, $min コレクション内の全文書の値に対応する最小値を取得します。
Sql: {コード
Mongodb
db.mycol.aggregate([{$group: {_id: '$sex', maxScore: {$max: '$score'}}}])
画像
5, $pushは、ドキュメント内のあるカラムに対応するすべてのデータを値の配列に格納します。
Mongodb
select sex,min(score) minScore frommycol group by sex
画像
6, $addToSet 値の配列に挿入されたすべてのデータに対応するドキュメントの列に、 重複を削除します。
db.mycol.aggregate([{$group: {_id: '$sex', minScore: {$min: '$score'}}}])
画像
7, $firstはリソースドキュメントのソートにしたがって最初のドキュメントデータを取得します。
db.mycol.aggregate([{$group: {_id: '$sex', scores : {$push: '$score'}}}])
画像
8. リソースドキュメントの並び順に従って、$lastは最後のドキュメントデータを取得します。
db.mycol.aggregate([{$group: {_id: '$sex', scores : {$addToSet: '$score'}}}])
画像
9. 全統計値 null
db.mycol.aggregate([{$group: {_id: '$sex', firstPerson : {$first: '$name'}}}])
画像
例
今、t2セットには次のようなデータがあります。
{ "country" : "china", "province" : "sh", "userid" : "a" }.
{ "country" : "china", "province" : "sh", "userid" : "b" }.
{ "country" : "china", "province" : "sh", "userid" : "a" }.
{ "country" : "china", "province" : "sh", "userid" : "c" }.
{ "country" : "china", "province" : "bj", "userid" : "da" }.
{ "country" : "china", "province" : "bj", "userid" : "fa". }
要件は、それぞれの国/都道府県の下にあるユーザーIDの数を数えることです(同じユーザーIDは1度だけカウントされます)。
手順は以下の通りです。
まず、このように数えてみてください。
db.mycol.aggregate([{$group: {_id: '$sex', lastPerson : {$last: '$name'}}}])
その結果、エラーとなる。
その理由は、ユーザーIDが同じ場合(上のデータではユーザーID=aが2つある)を区別していないためです
この問題を解決するために、まず、国、県、ユーザIDのフィールドをidとするグループを実行します。
db.mycol.aggregate([{$group:{_id:null,totalScore:{$push:'$score'}}}])
画像
ご覧のように、このステップの目的は、同一のユーザーIDを1つだけ残すことです。
そして、第2ステップでは、第1ステップの結果の上に、統計処理を行う。
db.t2.aggregate([{$group:{"_id":{"country":"$country","prov":"$province"}," number":{$sum:1}}}])
今度こそ正しい
プロジェクト演算子を追加し、_idを削除します。
db.t2.aggregate([ { $group: { "_id": { "country" : "$country", "province": "$province" , " quot;uid" : "$userid" } } ])
最終的には以下のようになります。
パイプラインの概念
パイプは、一般にUnixやLinuxで、現在のコマンドの出力を次のコマンドの引数として受け取るために使用されます。
MongoDB の集約パイプラインは、あるパイプラインで処理された MongoDB ドキュメントの結果を次のパイプラインに渡し、処理させます。パイプラインの操作は繰り返し可能です。
エクスプレッションです。入力された文書を処理し、出力する。式はステートレスであり、現在の集約パイプラインのドキュメントを計算するためにのみ使用でき、他のドキュメントを処理するために使用することはできない。
ここでは、アグリゲーションフレームワークでよく使われるいくつかの操作について説明する。
- プロジェクト 入力ドキュメントの構造を変更します。フィールドの名前の変更、追加、削除のほか、計算結果やネストされたドキュメントの作成に使用できます。
- マッチ データをフィルタリングして、条件に一致するドキュメントだけを出力するのに使います。match は MongoDB の標準的なクエリ操作を使います。
- Limit: MongoDB 集約パイプラインが返すドキュメントの数を制限するために使います。
- skip: 集約パイプラインで指定した数のドキュメントをスキップし、残りのドキュメントを返します。
- ドキュメント内の特定の配列型フィールドを複数のエントリに分割し、 それぞれに配列からの値をひとつずつ格納する $unwind: ドキュメント内の特定の配列型フィールドを分割する。
- group: コレクション内のドキュメントをグループ化し、統計的な結果を得るために使用できる。
- $sort。入力されたドキュメントをソートして出力します。
- $geoNear: 特定の地理的位置に近い順番のドキュメントを出力します。
1. $projectインスタンス
db.t2.aggregate([
{ $group: { "_id": { "country" : "$country", "province": "$province" , "uid" : "$userid" } } quot;$userid" } } ,
{ $group: { "_id": { "country" : "$_id.country", "province": "$_id.province" }, count : { $sum : 1 } }
])
画像
デフォルトでは、_idフィールドが含まれますが、_idを除外したい場合は、そのようにします。
db.t2.aggregate([ { $group: { "_id": { "country" : "$country", "province": "$province" , & quot;uid" : "$userid" } } ,
{ $group: { "_id": { "country" : "$_id.country", "province": "$_id.province" }, count: { $sum : 1 } },
{ $project : { "_id": 0, "country" : "$_id.country", "province" : "$_id.province", " count" : 1}}
])
画像
2. $matchの例
match を使って、スコアが 30 以上 100 未満のレコードを取得し、対象となるレコードを $group パイプライン演算子の次のステージに送って処理します。
db.mycol.aggregate({$project:{name : 1, score : 1}})
画像
概要
これはMongoDB集約グループについてのこの記事の終わりです、より関連するMongoDB集約グループの内容は、BinaryDevelopの過去の記事を検索してくださいまたは、次の関連記事を閲覧し続けるBinaryDevelopをサポートすることを願って、今後もっと!...
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン