【问题标题】:Using $sum to calculate the total value in a object, mongoose/mongodb [duplicate]使用 $sum 计算对象中的总值,mongoose/mongodb [重复]
【发布时间】:2015-03-02 13:37:26
【问题描述】:

我有这个:

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 功能。不确定如何。

【问题讨论】:

    标签: mongodb mongoose


    【解决方案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
    }
    

    【讨论】:

    • 你是对的。这是一个更灵活的模式。谢谢。
    • 我还想在我的问题中包含“标题”和“描述”。您能否更新您的答案,以便将其也包括在内?
    • 我已更新答案以包含该内容
    猜你喜欢
    • 1970-01-01
    • 2019-01-12
    • 2018-10-10
    • 2018-02-21
    • 2013-03-31
    • 2020-08-05
    • 1970-01-01
    • 2018-11-10
    • 1970-01-01
    相关资源
    最近更新 更多