2017-02-08 9 views
0

したがって、特定のデータポイントについては、ドキュメントがnullまたはないデータがあります。ここで がデータにヌル(Mongodb)のときに集計が正しくない

db.perfR.find({platform:"mac", "filename" : "f1.json"},{filename:1, platform:1, int_secs:1, version:1, _id:0}) 

{ "filename" : "f1.json", "platform" : "mac", "version" : "1.4.14", "int_secs" : 15 } 

を実証するいくつかのコマンドセットは「マック」のための唯一つのエントリ

db.perfR.find({platform:"win", "filename" : "f1.json"},{filename:1, platform:1, int_secs:1, version:1, _id:0}).count() 

0 

を示している。ここ勝利

のエントリを示していない集約コマンドは

db.perfR.aggregate([ {$sort:{version: -1 }},{ $group:{ _id: {platform:"win", "filename" : "f1.json", version:"$version"}, avgSecs: {$avg:"$int_secs"} } }]) 
です

と出力

{ "_id" : { "platform" : "win", "filename" : "f1.json", "version" : "1.4.13" }, "avgSecs" : 759 } 
{ "_id" : { "platform" : "win", "filename" : "f1.json", "version" : "1.4.14" }, "avgSecs" : 415.46153846153845 } 
{ "_id" : { "platform" : "win", "filename" : "f1.json", "version" : "3.0.0_dev" }, "avgSecs" : 563.8333333333334 } 

Mongodbはどこからデータを取得するのか、存在する値を探すためにどのように制限するのか混乱しています。

注:簡潔にするためにここでは示していない他のバージョンの他のエントリがあります。

aggregationコマンドを改善するための任意のポインタは、あなたがあなたのグループの_id仕様で文字列リテラルを提供している

答えて

1

有用であろう:

_id: {platform:"win", "filename" : "f1.json", version:"$version"} 

"win""f1.json"は単なる文字列リテラルです。ドキュメントの1つのフィールドのみが_idに使用されます - "$version"です。つまり、ドキュメントには3つの異なるバージョン値の3つのグループがあります。

正しい_id定義には、その三つのフィールドによるだろうグループ文書

_id: {platform:"$platform", filename : "$filename", version:"$version"} 

だろう。

注:一部のフィールドでコレクションをフィルタリングする場合は、そのために$ match stageを使用する必要があります。