sql >> データベース >  >> NoSQL >> MongoDB

MongoDB:それぞれの異なる値がいくつあるかを数えますか?

    あなたはとても親密でしたが、もちろん$eq true/falseを返すだけです 値なので、その数値を作成するには$condが必要です。 :

    db.collection(collectionName).aggregate([
      { "$group" : {
           "_id": "$item",
           "good_count": { 
               "$sum": { 
                   "$cond": [ { "$eq": [ "$rating",  "good" ] }, 1, 0] 
               }
           },
           "neutral_count":{
               "$sum": { 
                   "$cond": [ { "$eq": [ "$rating", "neutral" ] }, 1, 0 ]
                }
           },
           "bad_count": { 
               "$sum": { 
                   "$cond": [ { "$eq": [ "$rating",  "bad" ] }, 1, 0 ]
               }
           }
      }}
    ])
    

    「三項」演算子として$cond 最初の引数(if)として論理条件を取り、評価がtrueである2番目の引数を返します。 (その後)またはfalseの3番目の引数 (そうしないと)。これにより、true/false 1に戻ります および0 $sumにフィードする それぞれ。

    また、「case」は$eqの影響を受けやすいことに注意してください 。さまざまなケースがある場合は、$toLowerが必要になる可能性があります 式の中で:

                   "$cond": [ { "$eq": [ { "$toLower": "$rating" },  "bad" ] }, 1, 0 ]
    

    少し異なる点として、次の集計は通常、さまざまな可能な値に対してより柔軟であり、パフォーマンスの観点から条件付き合計の周りでリングを実行します。

    db.collection(collectionName).aggregate([
        { "$group": {
            "_id": { 
                "item": "$item",
                "rating": { "$toLower": "$rating" }
            },
            "count": { "$sum": 1 }
        }},
        { "$group": {
            "_id": "$_id.item",
            "results": {
                "$push": {
                    "rating": "$_id.rating",
                    "count": "$count"
                }
            }
        }}
    ])
    

    代わりに、次のような出力が得られます:

    {
        "_id": "item_1"
        "results":[
            { "rating": "good", "count": 12 },
            { "rating": "neutral", "count": 10 }
            { "rating": "bad", "count": 67 }
        ]
    }
    

    これはすべて同じ情報ですが、値を明示的に一致させる必要はなく、この方法ではるかに高速に実行されます。




    1. 最新のMongoDBバージョンにアップグレードするためのヒント

    2. ネストされた配列mongodbから要素を削除します

    3. MongoDBデータベースのコレクションを一覧表示する4つの方法

    4. mongodbが特殊文字を無視するのを止めますか?