在db

时间:2018-01-17 17:55:50

标签: node.js mongodb mongoose

我有一个每5分钟运行一次的程序,并检查上次更新用户数据的时间。如果超过4小时,则会调用更新例程,但随着服务的增长,我在给定时间内看到了一些呼叫数量激增。我想开始分发更新时间。因为我知道每次程序最后更新每个用户数据,我想知道是否有一种优雅的方法来找到时间之间的最大差距并将新用户的更新时间设置为?

这是一个例子。鉴于以下数据:

{
  "_id": "1",
  "updatedAt": "2018-01-17T01:12:33.807Z"
},{
  "_id": "2",
  "updatedAt": "2018-01-17T03:17:33.807Z"
},{
  "_id": "3",
  "updatedAt": "2018-01-17T02:22:33.807Z"
},{
  "_id": "4",
  "updatedAt": "2018-01-17T02:37:33.807Z"
}

给定更新之间的最长时间是id:1和id:3之间的1小时10分钟。我想要一个可以找到最大时间间隔的函数,并返回添加到下一个项目的建议更新时间' 2018-01-17T01:47:33.807Z'的数据库。这是通过花1小时10分钟然后除以2然后将其添加到id:1的日期来计算的。

我还要分发所有现有用户的更新时间,但我想这将是一个不同的功能。

1 个答案:

答案 0 :(得分:1)

您无法使用聚合框架进行差异样式比较。但是,您可以使用map reduce来获取文档之间的最大时间差异。

这样的东西
const columns = [
    {
        accessor: 'id',
        name: 'ID'
    },
    {
        accessor: 'name',
        name: 'name'
    }
];

const accessors = columns.map((column, key) => column.accessor);
Object.freeze(accessors);
// EXPECT ERROR
accessors.push('test');
console.log(accessors);

汇总查询:

db.col.mapReduce(
  function () {
   if (typeof this.updatedAt != "undefined") {
     var date = new Date(this.updatedAt);
     emit(null, date);
     }
  },
  function(key, dates) {
     result = {"prev":dates[0].getTime(), "last":dates[0].getTime(), "diff":0}
     for (var ix = 1; ix < dates.length; ix++) {
        value = dates[ix].getTime();
        curdiff = value - result.prev;
        olddiff = result.diff;
        if(olddiff < curdiff)
        result = {"prev":value, "diff":curdiff, "last":result.prev};
     }
    return result;
  },
  { 
    "sort":{"updatedAt":1},
    "out": { "inline": 1 },
    "finalize":function(key, result) {
     return new Date(result.last + result.diff/2);
    }
  }
)