如何在mongodb查询中计算平均,中位数,最小值,最大值?

时间:2019-06-25 06:07:10

标签: mongodb

我在该价格的集合中有ListPrice个字段,因此我必须计算出所有有效期standardStatus,已售出standardStatus的数据的最小值,最大值,中位数,平均值。

我尝试使用聚合和for循环进行计算,但无法正常工作

        db.collection('selected_properties').aggregate([
        { presentation_id : ObjectId(req.body.presentation_id),
          checked_status : true}
        },
        {
            $lookup : { from :'properties', localField : 'property_id', foreignField : '_id', as : 'property_info'}
        },
        {
            $unwind : {path : '$property_info', preserveNullAndEmptyArrays : true}
        },

        {
            $sort : {'property_info.ListPrice' : 1}
        },
        {
            $group:{
                 _id: "$user_id",
               minActiveListPrice: { $min: { $cond: [ {                 
                       $eq: [ "$property_info.StandardStatus", "A" ]}, 
                              '$property_info.ListPrice',''  ] } },
               maxActiveListPrice: { $max: { $cond: [ {
                        $eq: [ "$property_info.StandardStatus", "A" ]}, 
                               '$property_info.ListPrice',0 ] } },
               avgActiveListPrice: { $avg: { $cond: [ {
                        $eq: [ "$property_info.StandardStatus", "A" ]},
                                '$property_info.ListPrice',''  ] } },
               medianActiveListprice: { $push: { $cond: [ {
                        $eq: [ "$property_info.StandardStatus", "A" ]},                        
                               '$property_info.ListPrice',''  ] } },                                        
               minsoldListPrice: { $min: { $cond: [ {
                        $eq: [ "$property_info.StandardStatus", "S" ]},
                              '$property_info.ListPrice',''  ] } },
               maxsoldListPrice: { $max: { $cond: [ {
                        $eq: [ "$property_info.StandardStatus", "S" ]},
                              '$property_info.ListPrice',0  ] } },
               avgsoldListPrice: { $avg: { $cond: [ {
                        $eq: [ "$property_info.StandardStatus", "S" ]},
                              '$property_info.ListPrice',''  ] } },

                 avgPrice: { $avg: "$property_info.ListPrice" },
                 maxPrice: { $max: "$property_info.ListPrice" },
                 minPrice: { $min: "$property_info.ListPrice" },
              }
               median: { $push:  "$property_info.ListPrice"}                         
            }
         },

1 个答案:

答案 0 :(得分:0)

db.collection('selected_properties').aggregate([
        {
            $match : { presentation_id : ObjectId(req.body.presentation_id),
                      checked_status : true}
        },
        {
            $lookup : { from :'properties', localField : 'property_id', 
                        foreignField : '_id', as : 'property_info'}
        },
        {
            $unwind : {path : '$property_info', preserveNullAndEmptyArrays : true}
        },

        {
            $sort : {'property_info.ListPrice' : 1}
        },
        {
            $group:
              {
                _id: "$user_id",
                minActiveListPrice: { $min: { $cond: [ {                 
                         $eq: [ "$property_info.StandardStatus", "A" ]}, 
                                '$property_info.ListPrice',''  ] } },
                maxActiveListPrice: { $max: { $cond: [ {
                         $eq: [ "$property_info.StandardStatus", "A" ]}, 
                                '$property_info.ListPrice',0 ] } },
                avgActiveListPrice: { $avg: { $cond: [ {
                         $eq: [ "$property_info.StandardStatus", "A" ]},
                                '$property_info.ListPrice',''  ] } },
                medianActiveListprice: { $push: { $cond: [ {
                         $eq: [ "$property_info.StandardStatus", "A" ]},
                                '$property_info.ListPrice',null ] } },

                avgPrice: { $avg: "$property_info.ListPrice" },
                maxPrice: { $max: "$property_info.ListPrice" },
                minPrice: { $min: "$property_info.ListPrice" },
                median: { $push:  "$property_info.ListPrice"}                         
            }
        },
        { "$project": {
            "minActiveListPrice":1,
            "maxActiveListPrice":1,
            "avgActiveListPrice":1, 
            "avgPrice": 1,
            "maxPrice": 1,
            "minPrice": 1,
            "medianActiveListpricevalue": {
                $let: {
                    vars: {
                       arr: { $filter: {
                                input: "$medianActiveListprice",
                                as: "aa",
                                cond: {$ne:["$$aa",null]}
                            }},

                    },
                    in: {  "$cond": {
                        "if": {
                            "$eq": [{$mod: [ {$size:"$$arr"}, 2 ]}, 0]
                        },
                        "then": {
                            $avg:[ 
                            { $arrayElemAt: [ "$$arr", {$subtract:[{$divide: [ {$size:"$$arr"}, 2 ]},1]}]},
                            { $arrayElemAt: [ "$$arr", {$divide: [ {$size:"$$arr"}, 2 ]}]}
                            ]
                        },
                        "else": {
                            $arrayElemAt: [ "$$arr",{$floor : {$divide: [ {$size:"$$arr"}, 2 ]}}]
                       }
                            }}
                 }
            },

            "medianvalue":{  "$cond": {
                "if": {
                  "$eq": [{$mod: [ {$size:"$median"}, 2 ]}, 0]
                }
                "then": {
                    $avg:[ 
                    { $arrayElemAt: [ "$median", {$subtract:[{$divide: [ {$size:"$median"}, 2 ]},1]}]},
                    { $arrayElemAt: [ "$median", {$divide: [ {$size:"$median"}, 2 ]}]}
                    ]
                },
                "else": {
                     $arrayElemAt: [ "$median",{$floor : {$divide: [ {$size:"$median"}, 2 ]}}]
                }
            }}
        } }
    ])