web-dev-qa-db-ja.com

グループなしのMongodb平均集約クエリ

Mongoの集計フレームワークを使用して、フィールド全体の平均を取得しようとしています。ただし、グループパラメーターなしでそれを使用する例を見つけることができないようです。

次のドキュメント構造があります。

 {
      "_id" : ObjectId("5352703b61d2739b2ea44e4d"),
      "Semana" : "2014-02-23 - 2014-03-01",
      "bolsaDeValores" : "7",
      "bvc" : "8",
      "dollar" : "76",
      "ecopetrol" : "51",
      "dollarPrice" : "18"
 }

基本的に私がしたいことは、コレクション全体のbvcフィールドおよびその他の数値の平均値を可能な限り最速の方法で取得することです(集約フレームワークよりも効率が低いため、MapReduceを使用しません)。

私はゼロより大きい基準でもグループ化しようとしましたが、役に立ちませんでした:

db.EvaluatedSentiments.aggregate([
    { "$group": { 
        "bvc" : {"$gt:0"}
        }, 
        {
            "bvc" : { "$avg" : "$bvc"}
        }
    }
])

あなたが提供できるどんな助けにも感謝します。

参考資料: モンゴ集計マニュアル

11
NicolasZ

まず、数値を数値として保存します。その後、簡単なステートメントを使用して平均を計算できます。

db.collection.aggregate({ 
  "$group": {
    "_id": null, 
    "avg_bvc": { "$avg": "$bvc" } 
  } 
})

あなたは単により多くを使用することができます$avg他の数値フィールドの平均を取得する集計演算子:

db.collection.aggregate({ 
  "$group": {
    "_id": null, 
    "avg_bvc": { "$avg": "$bvc" }, 
    "avg_dollar": { "$avg": "$dollar" } 
  } 
})
40
Sebastian

したがって、データが実際には数値ではなく、数値である場合、「ゼロより大きい」値を持つドキュメントを除外するつもりであれば、 $match これらのドキュメントを「フィルタリング」するために、集約パイプラインのステートメント:

db.EvaluatedSentiments.aggregate([
    { "$match": {
        "bvc": { "$gt": 0 }
    }},
    { "$group": {
        "_id": null,
        "bvc": { "$avg": "$bvc" }
    }}
])
3
Neil Lunn