137

フィールドに DB に含まれる個別の値の数を計算するためのクエリはありますか。

fe 国を表すフィールドがあり、8 種類の国値 (スペイン、イングランド、フランスなど) があります。

誰かが新しい国でさらにドキュメントを追加した場合、クエリで 9 を返したいと思います。

グループ化してカウントするより簡単な方法はありますか?

4

7 に答える 7

252

MongoDB には、フィールドの個別の値の配列を返すdistinctコマンドがあります。カウントの配列の長さを確認できます。

シェルdb.collection.distinct()ヘルパーもあります:

> db.countries.distinct('country');
[ "Spain", "England", "France", "Australia" ]

> db.countries.distinct('country').length
4

MongoDBのドキュメントに記載されているように:

結果は最大 BSON サイズ (16MB) を超えてはなりません。結果が最大 BSON サイズを超える場合は、集計パイプラインを使用して個別の値を取得する で説明されているように、演算子$groupを使用して集計パイプラインを使用して個別の値を取得します。

于 2013-02-18T02:43:04.980 に答える
140

アグリゲーション API の使用例を次に示します。ケースを複雑にするために、ドキュメントの配列プロパティから大文字と小文字を区別しない単語でグループ化しています。

db.articles.aggregate([
    {
        $match: {
            keywords: { $not: {$size: 0} }
        }
    },
    { $unwind: "$keywords" },
    {
        $group: {
            _id: {$toLower: '$keywords'},
            count: { $sum: 1 }
        }
    },
    {
        $match: {
            count: { $gte: 2 }
        }
    },
    { $sort : { count : -1} },
    { $limit : 100 }
]);

のような結果を与える

{ "_id" : "inflammation", "count" : 765 }
{ "_id" : "obesity", "count" : 641 }
{ "_id" : "epidemiology", "count" : 617 }
{ "_id" : "cancer", "count" : 604 }
{ "_id" : "breast cancer", "count" : 596 }
{ "_id" : "apoptosis", "count" : 570 }
{ "_id" : "children", "count" : 487 }
{ "_id" : "depression", "count" : 474 }
{ "_id" : "hiv", "count" : 468 }
{ "_id" : "prognosis", "count" : 428 }
于 2015-10-29T15:37:24.257 に答える
27

MongoDb 3.4.4 以降では、$arrayToObject演算子と$replaceRootパイプラインを使用してカウントを取得できます。

たとえば、さまざまなロールを持つユーザーのコレクションがあり、ロールの個別の数を計算したいとします。次の集計パイプラインを実行する必要があります。

db.users.aggregate([
    { "$group": {
        "_id": { "$toLower": "$role" },
        "count": { "$sum": 1 }
    } },
    { "$group": {
        "_id": null,
        "counts": {
            "$push": { "k": "$_id", "v": "$count" }
        }
    } },
    { "$replaceRoot": {
        "newRoot": { "$arrayToObject": "$counts" }
    } }    
])

出力例

{
    "user" : 67,
    "superuser" : 5,
    "admin" : 4,
    "moderator" : 12
}
于 2018-02-08T22:37:09.973 に答える
10

Mongo Shell Extensionsを活用できます。$HOME/.mongorc.jsNode.js/io.js でコーディングしている場合は、プログラムで、またはプログラムで追加できる単一の .js インポートです。

サンプル

フィールドの個別の値ごとに、必要に応じてクエリでフィルター処理されたドキュメント内のオカレンスをカウントします

>db.users.distinctAndCount('name', {name: /^a/i})

{
  "Abagail": 1,
  "Abbey": 3,
  "Abbie": 1,
  ...
}

フィールド パラメータは、フィールドの配列である可能性があります

>db.users.distinctAndCount(['name','job'], {name: /^a/i})

{
  "Austin,Educator" : 1,
  "Aurelia,Educator" : 1,
  "Augustine,Carpenter" : 1,
  ...
}
于 2015-05-13T13:03:24.017 に答える