データベースの実用化では、私たちはしばしば、データ、統計やデータ統合に対処する私たちを助けるために集計操作を使用する必要があります
この記事では、MongoDBの中で集計操作を使用する方法を学習します
図1に示すように、集約関数重合導管
次のように基本的な構文重合管を使用して集計関数:
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
一般的な集約関数は次のよう:
データ処理機能は、主に重合、例えば加算、平均化などのために使用され、最後の計算結果を返します
演算子 | 説明 |
---|---|
$和 | 加算 |
$の平均 | アベレージ |
$ | 最小の場合 |
$マックス | 最大値を求めて |
最初の$ | 最初の文書を入手 |
$最後 | 最後の文書を取得します。 |
$プッシュ | 配列に値を挿入します |
次のように一般的な高分子パイプは、以下のとおりです。
処理パイプラインの結果にポリマーパイプは継続次処理パイプラインに渡すことができます
演算子 | 説明 |
---|---|
$グループ | グループ文書の場合 |
$プロジェクト | 文書構造を変更するために使用、あなたでは、フィールドの追加や削除、名前を変更することができます |
$マッチ | 基準文書を満たしていないフィルター |
$ソート | ドキュメント出力を注文した後、 |
$リミット | 特定の数を読み取るために、レコードの数を指定します。 |
$スキップ | 特定の数をスキップするレコードの数を指定します。 |
さて、最初のテストデータの準備ができて、少し来て試してみましょう
> use university
> db.teacher.insert([
{
'tid': '19001',
'name': 'Alice',
'age': 32,
'department': 'Computer',
'salary': 10000
},
{
'tid': '19002',
'name': 'Bob',
'age': 48,
'department': 'Computer',
'salary': 15000
},
{
'tid': '19003',
'name': 'Alice',
'age': 42,
'department': 'Software',
'salary': 12000
},
{
'tid': '19004',
'name': 'Christy',
'age': 38,
'department': 'Software',
'salary': 14000
},
{
'tid': '19005',
'name': 'Daniel',
'age': 28,
'department': 'Architecture',
'salary': 8000
}
])
すべての教師のための総賃金統計
db.teacher.aggregate([
{
$group: {
_id: null, // 不进行分组
total_salary: { $sum: '$salary' } // 对 salary 字段的值进行累加
}
},
{
$project: {
_id: 0, // 不输出 _id 字段
total_salary: 1 // 输出 total_salary 字段
}
}
])
// 查询结果
// { "total_salary" : 59000 }
10,000人以上の教員の総数は、統計を賃金
db.teacher.aggregate([
{
$match: {
salary: { $gt: 10000 } // 返回 salary 字段的值大于 10000 的文档
}
},
{
$group: {
_id: null, // 不进行分组
total_teacher: { $sum: 1 } // 对数值 1 进行累加
}
},
{
$project: {
_id: 0, // 不输出 _id 字段
total_teacher: 1 // 输出 total_teacher 字段
}
}
])
// 查询结果
// { "total_teacher" : 3 }
各学部の平均賃金の統計、および小から大出力するために平均賃金に従って
db.teacher.aggregate([
{
$group: {
_id: '$department', // 以 department 字段的值进行分组
avg_salary: { $avg: '$salary' } // 对 salary 字段的值求平均数
}
},
{
$project: {
_id: 0, // 不输出 _id 字段
dept_name: '$_id', // 增加 dept_name 字段,并将其值取为 _id 字段的值
avg_salary: 1 // 输出 avg_salary 字段
}
},
{
$sort: {
avg_salary: 1 // 按照 avg_salary 字段的值进行升序排列
}
}
])
// 查询结果
// { "avg_salary" : 8000, "dept_name" : "Architecture" }
// { "avg_salary" : 12500, "dept_name" : "Computer" }
// { "avg_salary" : 13000, "dept_name" : "Software" }
トップ3つの出力番号の教師の給与
db.teacher.aggregate([
{
$sort: {
salary: -1 // 按照 salary 字段的值进行降序排列
}
},
{
$limit: 3 // 限制只能读取 3 条文档
},
{
$project: {
_id: 0, // 不输出 _id 字段
tid: 1 // 输出 tid 字段
}
}
])
// 查询结果
// { "tid" : "19002" }
// { "tid" : "19004" }
// { "tid" : "19003" }
2、地図を削減します
パイプ外側ポリマー集計機能に加えて、MongoDBは、別のより柔軟な高分子操作が - 地図減らし
コンピューティング・モデルであり、実行する大きなワークブレークダウン(マップ)であり、そして、最終的な結果として、結果(低減)をマージすることができる地図減らし
次のようにその基本的な構文は次のとおりです。
db.COLLECTION_NAME.aggregate(
function() { emit(key, value) }, // map 函数,生成键值对序列,作为 reduce 函数的参数
function(key, values) { return reduceFunction }, // reduce 函数,处理 values
{
query: <query>, // 指定筛选条件,只有满足条件的文档才会调用 map 函数
sort: <function>, // 在调用 map 函数前给文档排序
limit: <number>, // 限制发给 map 函数的文档数量
finalize: <function>, // 在存入结果集合前修改数据
out: <collection>, // 指定结果存放的位置,若不指定则使用临时集合
}
)
のは、例を挙げてみましょう
統計各大学の30歳以上の教師、10,000人以上の大学の平均賃金が、賃金に関する情報を出力しません
db.teacher.mapReduce(
// 2、执行 map 函数,map 函数的核心是调用 emit 函数,提供 reduce 函数的参数
// emit 函数的第一个参数指定需要分组的字段,第二个参数指定需要进行统计的字段
// 这里依据 department 字段的值分组,作为 key;组合 salary 字段的值成为数组,作为 values
// 将每个分组得到的 (key, values) 作为 reduce 函数的参数传递过去
function() { emit(this.department, this.salary) },
// 3、执行 reduce 函数,reduce 函数的核心是将 (key, values) 变成 (key, value)
// 该函数的参数 (key ,values) 从 map 函数而来,并返回一个处理后的值作为 value
// value 与 key 组合成 (key, value) 再向后传递
// 这里返回一个使用 avg 函数对 values 求得的平均值
function(key, values) { return Array.avg(values) },
{
// 1、首先执行 query,筛选掉不符合条件的文档,然后将符合条件的文档发送到 map 函数
query: { age: { $gt: 30 } },
// 4、执行 finalize 函数,在将结果储存到 out 集合之前进行处理
// 该函数的参数 (key, value) 从 reduce 函数而来,并返回一个处理后的值作为 value
// 这里将平均工资信息隐藏,即将 value 字段的值设为 null
finalize: function(key, value) {
return null
},
// 5、将最终处理后的结果存到 total_teacher 集合
out: 'total_teacher'
}
)
あなたは、次の出力を見ることができます
{
"result" : "total_teacher", // 储存结果的集合名称
"timeMillis" : 276, // 花费的时间,单位为毫秒
"counts" : {
"input" : 4, // 经过筛选后发送到 map 函数的文档个数
"emit" : 4, // 在 map 函数中处理的文档个数
"reduce" : 2, // 在 reduce 函数中处理的文档个数
"output" : 2 // 结果集合的文档个数
},
"ok" : 1
}
そして、結果を表示
> show collections
// teacher
// total_teacher
> db.total_teacher.find()
// { "_id" : "Computer", "value" : null }
// { "_id" : "Software", "value" : null }
[見て、記事のより多くのMongoDBシリーズを読むのMongoDBの研究ノート ]