2017-10-13 9 views
1

ネストされたオブジェクトに空の配列を返す動作しません。ここではMongoDBのクエリイムランニングです:

db.contracts.aggregate([{ 
    $group: { 
     _id: null, 
     quotation_subtotal_max:{ "$max":"$quotation.subtotal" }, 
     quotation_subtotal_min:{ "$min":"$quotation.subtotal" }, 
     quotation_subtotal_avg:{ "$avg":"$quotation.subtotal" }, 
     quotation_subtotal_sum:{ "$sum":"$quotation.subtotal" }, 
     works_package_max:{ "$max":"$works.package.price" }, 
     works_package_min:{ "$min":"$works.package.price" }, 
     works_package_avg:{ "$avg":"$works.package.price" }, 
     works_package_sum:{ "$sum":"$works.package.price" }, 
     sum:{ "$sum":1 }, 
    } 
}]) 

結果iは取り戻す:私のJSONの

/* 1 */ 
{ 
    "_id" : null, 
    "quotation_subtotal_max" : 87980.0, 
    "quotation_subtotal_min" : 4030.0, 
    "quotation_subtotal_avg" : 34636.7681818182, 
    "quotation_subtotal_sum" : 762008.9, 
    "works_package_max" : [], 
    "works_package_min" : 11388.0, 
    "works_package_avg" : 15138.0, 
    "works_package_sum" : 30276.0, 
    "sum" : 23.0 
} 

構造オブジェクトMongoDB

{ 
    "_id" : ObjectId("59b0de14152588bb75175502"), 
    "quotation" : { 
     "subtotal" : 80883.0, 
    }, 
    "works" : { 
     "package" : { 
      "price" : 18888.0, 
      "items" : [ 
       { 
        "name" : "Package A", 
        "price" : 18888.0 
       } 
      ] 
     } 
    } 
} 

私はMongoDB 3.2を使用しています。

"works_package_max"に対して$ maxが空の配列を返すのはなぜですか? 私はそれが完全にうまく機能した2レベルネストしました。 しかし、私が3レベルのネストしたときには、$ maxだけが機能しません。 $ min $ avg $ sumは、2レベルと3レベルの両方のネスティングで期待通りに機能します。

UPDATE 1

だから何が起こっているのは、私は私のコレクションに23件の文書を持っているということです。それだけで空の配列ですので、この文書はない「作品」を持っていないので、文書の22はこの

{ 
    "_id" : ObjectId("59b0de14152588bb75175502"), 
    "quotation" : { 
     "subtotal" : 80883.0, 
    }, 
    "works" : { 
     "package" : { 
      "price" : 18888.0, 
      "items" : [ 
       { 
        "name" : "Package A", 
        "price" : 18888.0 
       } 
      ] 
     } 
    } 
} 

が、1つの文書のように見えるが、この

{ 
    "_id" : ObjectId("59b0de14152588bb75175502"), 
    "quotation" : { 
     "subtotal" : 80883.0, 
    }, 
    "works" : [] 
} 

のように見えますが、これはなるために$の最大の原因となります[]が、$ min $ avg $ sumに問題はありません。どうしてそうですか?

"作品"が空の文書を除外してこれを修正する方法はありますか?

+0

私はこのクエリを実行して正常に動作し、希望の結果を得られます – Sam

+0

私は完全なデータセットを提供しませんでした。それはちょうど構造です。とにかく、理由を知りました。私は私の質問を更新します。 –

+0

あなたのデータを詳しく見てください。実際には少なくとも一つのドキュメントの 'works.package.price'に配列が格納されます。おそらく 'db.contracts.find({" $ where ":" this.works.package.price instanceof Array "})'でこれをテストできます。 –

答えて

0

$ matchパイプライン演算子を追加すると、ネストされたサブ文書 "works.package.price"が存在しない文書をフィルタリングできます。

db.contracts.aggregate([ 
    { 
     $match : { 
        "works.package.price": { "$exists" : 1 } 
       } 
    }, 
    { 
     $group: { 
      _id: null, 
      quotation_subtotal_max:{ "$max":"$quotation.subtotal" }, 
      quotation_subtotal_min:{ "$min":"$quotation.subtotal" }, 
      quotation_subtotal_avg:{ "$avg":"$quotation.subtotal" }, 
      quotation_subtotal_sum:{ "$sum":"$quotation.subtotal" }, 
      works_package_max:{ "$max":"$works.package.price" }, 
      works_package_min:{ "$min":"$works.package.price" }, 
      works_package_avg:{ "$avg":"$works.package.price" }, 
      works_package_sum:{ "$sum":"$works.package.price" }, 
      sum:{ "$sum":1 }, 
     } 
    }]) 
+0

[]が$ maxではなく$ max $ avgと$ sumを壊す理由は何ですか? –