MongoDB $ max无法按预期工作,在嵌套对象中返回一个空数组

时间:2017-10-13 04:30:02

标签: mongodb

这是我正在运行的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的问题,为什么会这样呢?

有没有办法通过过滤掉那些“作品”为空的文件来解决这个问题?

1 个答案:

答案 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 },
        }
    }])