ネストされたオブジェクトに空の配列を返す動作しません。ここでは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に問題はありません。どうしてそうですか?
"作品"が空の文書を除外してこれを修正する方法はありますか?
私はこのクエリを実行して正常に動作し、希望の結果を得られます – Sam
私は完全なデータセットを提供しませんでした。それはちょうど構造です。とにかく、理由を知りました。私は私の質問を更新します。 –
あなたのデータを詳しく見てください。実際には少なくとも一つのドキュメントの 'works.package.price'に配列が格納されます。おそらく 'db.contracts.find({" $ where ":" this.works.package.price instanceof Array "})'でこれをテストできます。 –