mongodb +添加字段+使用其他字段来计算+获取最大值

时间:2013-11-28 23:13:40

标签: mongodb aggregation-framework

我在mongodb中有以下文档(2个节点NodeA和NodeB的每小时数据1周)

> db.collection_name.find().pretty()
{
        "_id" : ObjectId("52979bc7ebf1a5ecb120ae65"),
        "Time" : "18/11/2013 0:00",
        "Node Name" : "NodeA",
        "Integrity" : "100%",
        "X_1" : 103674,
        "X_2" : 45,
        "X_3" : 13071,
        "X_4" : 103626,
        "X_5" : 46,
        "X_6" : 14639
}
{
        "_id" : ObjectId("52979bc7ebf1a5ecb120ae66"),
        "Time" : "18/11/2013 0:00",
        "Node Name" : "NodeB",
        "Integrity" : "100%",
        "X_1" : 103674,
        "X_2" : 45,
        "X_3" : 13071,
        "X_4" : 103626,
        "X_5" : 46,
        "X_6" : 14639
}

... 

{
        "_id" : ObjectId("52979bc7ebf1a5ecb120ae67"),
        "Time" : "24/11/2013 23:00",
        "Node Name" : "NodeA",
        "Integrity" : "100%",
        "X_1" : 103674,
        "X_2" : 45,
        "X_3" : 13071,
        "X_4" : 103626,
        "X_5" : 46,
        "X_6" : 14639
}
{
        "_id" : ObjectId("52979bc7ebf1a5ecb120ae68"),
        "Time" : "24/11/2013 23:00",
        "Node Name" : "NodeB",
        "Integrity" : "100%",
        "X_1" : 103674,
        "X_2" : 45,
        "X_3" : 13071,
        "X_4" : 103626,
        "X_5" : 46,
        "X_6" : 14639
}

现在我要做的是用这样的东西创建一个新字段:

db.students.update({},{$set :{"new_field_name":<values_of_new_dieldname>}},{upsert:false,multi:true})

在我要做的<values_of_new_dieldname>(X_1 + X_3)* 8/3600中,我们称之为calcA,它会给出类似的结果:(在这个阶段我不关心X1-&gt; x6 )

{
        "_id" : ObjectId("52979bc7ebf1a5ecb120ae91"),
        "Time" : "24/11/2013 23:00",
        "Node Name" : "NodeA",
        "new_field_name": calcA
}
{
        "_id" : ObjectId("52979bc7ebf1a5ecb120ae90"),
        "Time" : "24/11/2013 23:00",
        "Node Name" : "NodeB",
        "new_field_name": calcA
}

然后我想结合“节点名称”来获得“new_field_name”的总和,这将得到类似的结果:

_id {

        "Time" : "24/11/2013 23:00",
        "field_name": calcA + calcA  (from NodeA and NodeB)
}

所以那时我将从“18/11/2013 0:00”每小时获得其中一个 - &gt; “24/11/2013 23:00”这个例子。

然后我想获得“fieldname”的最大值

这就是我想要做的事情,我希望它很清楚。我目前正在寻找使用聚合方法来尝试实现这一目标。我会采用这种方法。

感谢

1 个答案:

答案 0 :(得分:1)

你可以尝试这样的事情。

db.yourcollection.aggregate(
{ $group:
  {
    _id:"$Time",
        x1sum: {$sum:"$X_1"},
    X3sum: {$sum:"$X_3"}
  }
},

{ $project:
  {
    _id:1,
    calculation: {$divide:[[{$multiply:[{$add:["$x1sum","$x2sum"]},8}],3600]
  }  

});

请重新检查sintax,因为我现在无法测试它,并且它是用记事本写的,并且有很多花括号。

如您所见,它首先按时间对数据进行分组,然后在投影中进行数学运算。

如果需要,可以使用新管道订购结果,或在新的组管道中使用$ max。