使用$ sum计算对象中的总值mongoose / mongodb

时间:2015-03-02 13:37:26

标签: mongodb mongoose

我有这个:

var actions = [
  project: 23123,
  title: 'Change of windows
  energySaving: {
      electricity: {
        lighting: 24324,
        equipment: 23423,
        fans: 234234,
        distribution: 234324,
        chiller: 234234,
        other: 234324
      },
      heating: {
        ventilation: 234324,
        shell: 23423,
        tapWater: 23423
      },
  }
]);

这是我从动作集合中获取一些字段的查询:

mongoose.model('Action').find({project: project._id})
  .select('title description energySaving')

      .exec(function(err, actions){
      res.status(200).send(actions);
    });
  })

我不想获得整个“energySaving”属性,而是将其替换为“totalEnergySaving”,它是所有子对象的总和。是否可以使用聚合来执行此操作?如果是这样,那可能是$sum功能。不太确定如何。

1 个答案:

答案 0 :(得分:1)

使用当前架构设计实现聚合非常困难,因为您拥有任意字段名称。为了进行大多数类型的查询和操作,您需要重新设计架构以存储您的数据,如下所示:

{
    "_id" : ObjectId("54f46f18c36dcc206d0cec38"),
    "project" : 23123,
    "title" : "Change of windows",
    "energySaving" : [ 
        {
            "energy" : "electricity",
            "type" : "lighting",
            "value" : 24324
        }, 
        {
            "energy" : "electricity",
            "type" : "equipment",
            "value" : 24324
        }, 
        {
            "energy" : "electricity",
            "type" : "fans",
            "value" : 24324
        }, 
        {
            "energy" : "electricity",
            "type" : "distribution",
            "value" : 24324
        }, 
        {
            "energy" : "electricity",
            "type" : "chiller",
            "value" : 24324
        }, 
        {
            "energy" : "electricity",
            "type" : "other",
            "value" : 24324
        }, 
        {
            "energy" : "heating",
            "type" : "ventilation",
            "value" : 24324
        }, 
        {
            "energy" : "heating",
            "type" : "shell",
            "value" : 24324
        }, 
        {
            "energy" : "heating",
            "type" : "tapWater",
            "value" : 24324
        }
    ]
}

然后您可以汇总以获得最终的titledescriptiontotalEnergySaving,如下所示:

db.collection.aggregate( [
    { $unwind: "$energySaving" },
    { 
       $group: {
          _id: {
             title: '$title',
             description: '$description' 
          },
          totalEnergySaving: { $sum: '$energySaving.value' } 
       } 
    },
    {
        $project: {
            _id: 0,
            title: '$_id.title',
            description: '$_id.description',
            totalEnergySaving: 1
        }
    }
]);

结果:

{
    "result" : [ 
        {
            "totalEnergySaving" : 218916,
            "title" : "Change of windows",
            "description" : "Detailed breakdown of energy savings"
        }
    ],
    "ok" : 1
}