使用来自文档和文档中的另一个字段的值重新计算字段。计算

时间:2014-05-09 12:08:43

标签: node.js mongodb

使用mongodb-native软件包在node.js中执行此操作。

让我们说文件有这种结构:

{
  name: "Document A", // just a string field
  var1: 10, // some variable, it is increaded if user do a cetrain action
  date_created: '2014-01-07' // stored as ISO date, here I simplified it,
}

对于集合中的每个文档,我必须创建 - 如果不存在或更新 varComp 变量,并且应使用当前文档中的值计算其值。计算公式是这样的(伪代码):

varComp = (5 + var1) / (Date.now() - date_created)^2.5

据我所知,在这种情况下更新必须使用聚合框架(由于除法),但是如何计算2个日期差异的权力2.5,必须以加权前的小时数表示?我无法仅在插入/更新 var1 时计算它,因为无论每个文档都必须重新计算,比如说,通过调用重新计算例程,可以重新计算5个小时。

1 个答案:

答案 0 :(得分:1)

1.使用聚合框架无法更新数据库中的数据。但是使用聚合框架,您可以在飞行中进行一些计算。不幸的是,聚合框架中没有实现pow操作。你应该使用MapReduce。

2.或者,你可以选择一个单独的流程来按计划进行计算(每5个小时)并将结果写入数据库。 MongoDb shell的实现:

var myCursor =  db.yourCollection.find({ });

myCursor.forEach(function(d){ 

  var varComp = (5 + d.var1) / Math.pow(Date.now() - d.date_created, 2.5);

  db.yourCollection.update({_id:d._id},{$set:{ varComp: varComp }});

});