这是我正在运行的MongoDB Query:
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 },
}
}])
我得到的结果是:
/* 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中我的JSON对象的结构
{
"_id" : ObjectId("59b0de14152588bb75175502"),
"quotation" : {
"subtotal" : 80883.0,
},
"works" : {
"package" : {
"price" : 18888.0,
"items" : [
{
"name" : "Package A",
"price" : 18888.0
}
]
}
}
}
我正在使用MongoDB 3.2。
为什么$ max为“works_package_max”返回一个空数组? 我做了2级嵌套它工作得非常好。 但是当我做3级嵌套时,只有$ max不起作用。 $ min $ avg $ sum对于2级和3级嵌套都是预期的。
更新1
所以发生的事情是我的收藏中有23个文件。 22个文件看起来像这样
{
"_id" : ObjectId("59b0de14152588bb75175502"),
"quotation" : {
"subtotal" : 80883.0,
},
"works" : {
"package" : {
"price" : 18888.0,
"items" : [
{
"name" : "Package A",
"price" : 18888.0
}
]
}
}
}
但是一个文档看起来像这样
{
"_id" : ObjectId("59b0de14152588bb75175502"),
"quotation" : {
"subtotal" : 80883.0,
},
"works" : []
}
因为这个文件没有“工作”所以它只是一个空数组,但是这会导致$ max成为[],但不会导致$ min $ avg $ sum的问题,为什么会这样呢?
有没有办法通过过滤掉那些“作品”为空的文件来解决这个问题?
答案 0 :(得分: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 },
}
}])