2013-11-28 52 views
0

我都有下列文件中的MongoDB(每小时的数据1周2个节点nodeA和基站)MongoDB的+加场使用其他领域来计算+获得MAX +

> 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-> 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“ - >”2013年11月24日23:00“。

,然后我想要得到的“字段名”

良好的最大值,这就是我想要做的,我希望这是明确的。我目前正在使用聚合方法来尝试实现这一点。我会用这种方法是对的吗?

谢谢

+0

这个问题很具体。较小的用例会更好。 – mikemaccana

+0

你真的不想把时间存储在我猜想的是MM/DD/YYYY中。使用ISODate()。 – mcr

回答

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。