私はMongoDBを使って簡単な方法を見つけようとしています。
SELECT province, COUNT(*) FROM contest GROUP BY province
しかし、集計関数を使用してそれを理解することはできません。本当に変なグループ構文を使ってそれを行うことができます
db.user.group({
"key": {
"province": true
},
"initial": {
"count": 0
},
"reduce": function(obj, prev) {
if (true != null) if (true instanceof Array) prev.count += true.length;
else prev.count++;
}
});
しかし、集計関数を使用するより簡単な方法はありますか。
これは aggregate
を使って簡単に行うことができます。
db.contest.aggregate([
{"$group" : {_id:"$province", count:{$sum:1}}}
])
グループ化するために複数の列が必要な場合は、このモデルに従ってください。ここで私はstatus
とtype
によるカウントを行っています。
db.BusinessProcess.aggregate({
"$group": {
_id: {
status: "$status",
type: "$type"
},
count: {
$sum: 1
}
}
})
集計関数の結果に基づいて、追加の操作が必要です。最後に、MongoDBで集計関数とその結果に基づいた操作の解決方法を見つけました。フィールドrequest, source, status, requestDate
を持つコレクションRequest
を作成しました。
&フィールド数による単一フィールドグループ
db.Request.aggregate([
{"$group" : {_id:"$source", count:{$sum:1}}}
])
複数のフィールドでグループ化して数を数える:
db.Request.aggregate([
{"$group" : {_id:{source:"$source",status:"$status"}, count:{$sum:1}}}
])
複数のフィールドでグループ化し、フィールドを使用して並べ替えてカウント:
db.Request.aggregate([
{"$group" : {_id:{source:"$source",status:"$status"}, count:{$sum:1}}},
{$sort:{"_id.source":1}}
])
複数のフィールドでグループ化して、カウントを使用してソートでカウント:
db.Request.aggregate([
{"$group" : {_id:{source:"$source",status:"$status"}, count:{$sum:1}}},
{$sort:{"count":-1}}
])
さらに、グループ化を制限する必要がある場合は、次のものを使用できます。
db.events.aggregate(
{$match: {province: "ON"}},
{$group: {_id: "$date", number: {$sum: 1}}}
)
このタイプのクエリは私のために働きました:
db.events.aggregate({$group: {_id : "$date", number: { $sum : 1} }} )
http://docs.mongodb.org/manual/tutorial/aggregation-with-user-preference-data/ を参照してください。
MongoDB 3.4から、$sortByCount
集計を使用できます。
指定された式の値に基づいて着信文書をグループ化してから、各個別グループ内の文書の数を計算します。
https://docs.mongodb.com/manual/reference/operator/aggregation/sortByCount/
例えば:
db.contest.aggregate([
{ $sortByCount: "$province" }
]);