我在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”的最大值
这就是我想要做的事情,我希望它很清楚。我目前正在寻找使用聚合方法来尝试实现这一目标。我会采用这种方法。
感谢
答案 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。