MongoDB SELECT COUNT GROUP BY


179

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++;
    }
});

しかし、集約関数を使用するより簡単/高速な方法はありますか?

回答:


326

これは次の方法で簡単に実行できますaggregate

db.contest.aggregate([
    {"$group" : {_id:"$province", count:{$sum:1}}}
])

1
試してみるとエラーメッセージが出"errmsg" : "exception: A pipeline stage specification object must contain exactly one field.",ますか?
スティーブン

並べ替えをどのようにグループ化しますか?カウントを-1で並べ替えたい
Filip Bartuzi

4
@FilipBartuziドキュメントページに例があります。次のように、パイプラインに並べ替え操作を追加する必要があります{ $sort: { count: -1 } }
elaich

@Stevenと同じ例外が発生しました。これは、2行目だけをコピーして貼り付け、周囲の角かっこを省略したためです。
PeterPerháč18年

plsはMongoDBの中に関連する質問についてあなたができれば、ヘルプ- stackoverflow.com/questions/61067856/...
newdeveloper

66

集計関数の結果に基づいて追加の操作が必要です。最後に、MongoDBの結果に基づいて、集計関数と操作のいくつかのソリューションを見つけました。Requestfieldのコレクションを持っていますrequest, source, status, requestDate

単一フィールドグループ&カウント:

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}}
])

50

グループ化に複数の列が必要な場合は、このモデルに従ってください。ここで私は、カウントを行っていますstatustype

  db.BusinessProcess.aggregate({
    "$group": {
        _id: {
            status: "$status",
            type: "$type"
        },
        count: {
            $sum: 1
        }
    }
   })

2
_idは、複数のフィールドをカプセル化するためのデフォルトのパラメーターを表しますか?
Eugen Sunic

18

さらに、グループ化を制限する必要がある場合は、以下を使用できます。

db.events.aggregate( 
    {$match: {province: "ON"}},
    {$group: {_id: "$date", number: {$sum: 1}}}  
)

17

MongoDB 3.4以降では、$sortByCount集計を使用できます。

指定された式の値に基づいて受信ドキュメントをグループ化し、各個別グループ内のドキュメントの数を計算します。

https://docs.mongodb.com/manual/reference/operator/aggregation/sortByCount/

例えば:

db.contest.aggregate([
    { $sortByCount: "$province" }
]);

2
おそらくここで注目に値するの$sortByCountは、実際にはMongoDB 3.4から導入されたさらにいくつかの集約ステージオペレーターのような「疑似オペレーター」です。彼らが実際に行うことは、それぞれの集約段階に拡大することだけです。この場合、既存の回答に示されている$groupwith $sum: 1と追加の$sort ステージ。これらは、より少ないコードを入力する」以外の利点を提供しません。これは、(その種のことをしている場合は)より記述的である場合とそうでない場合があります。別個私見、$groupおよび$sortコード内のステージははるかに記述的及び実際より柔軟です。
Neil Lunn、


0

私のために働いたMongoシェルコマンド:

db.getCollection(<collection_name>).aggregate([{"$match": {'<key>': '<value to match>'}}, {"$group": {'_id': {'<group_by_attribute>': "$group_by_attribute"}}}])
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.