如何在mongodb查询中将一个计算字段用于其他过滤条件?

时间:2019-07-02 05:14:08

标签: mongodb

我在mongoDB中具有属性数据,该数据具有字段{ListPrice,ClosePrice},并且希望拥有那些ListPrice小于所有选定属性的ClosePrice平均值的属性。

首先,我已经计算出ClosePrice的平均值,然后尝试实现$ cond来检查ListPrice是否小于将数据推送到字段中。

我希望获得ListPrice小于或等于ClosePrice的数据。

 db.collection('properties').aggregate([
    {
       $group:{
        _id: 1,
        avgClosePrice: { $avg: "$ClosePrice" },
        data : {
            $push : {
                $cond: [
                    {
                      $lte: ["$ListPrice", "$avgClosePrice"]
                    },
                    "$ListPrice",
                    0
                  ]
            }
        },
      } 
    },
  ]
    ).limit(100).toArray((err, response)=> {
if(err) console.log(err)
else console.log(response)
}

1 个答案:

答案 0 :(得分:0)

要在一个阶段中实现这一目标可能很困难,但是您可以将其分解为多个阶段并获得理想的结果。

尝试一下:

 db.collection('properties').aggregate([
    {
        $group:{
            _id: 1,
            avgClosePrice: { $avg: "$ClosePrice" },
            ListPrice : {$first  : "$ListPrice"}
        }
    },{
        $project : {
            avgClosePrice : "$avgClosePrice",
            data : {
                $expr : {
                    $cond : [
                        {
                            $lt : ["$ListPrice", "$avgClosePrice"]
                        },
                        "$ListPrice",
                        0
                    ]
                }
            }
        }
    },{
        $group : {
            _id : "$_id",
            avgClosePrice : {$first : "$avgClosePrice"},
            data : {$push : "$data"}
        }
    }
  ]
).limit(100).toArray((err, response)=> {
    if(err) console.log(err)
    else console.log(response)
}