如何在javascript中检查数据库条目是否超过1天

时间:2014-10-24 14:48:51

标签: javascript database node.js

我正在创建一个使用此数据库管理器的nod​​e.js应用程序:https://github.com/louischatriot/nedb

我有一个包含如下消息的数据库:

{"mes":"hi","username":"hello","number":1,"date":"Fri Oct 24 2014 10:42:53 GMT-0400 (Eastern Daylight Time)","_id":"Zzi6OQVnoSXKYlHR"}

我希望它删除超过1天的所有邮件。所以我做了类似的事情:

setInterval(function(){
        db.find({}).sort({ number: -1 }).exec(function (err, docs) {
            var arrayLength = docs.length;
            tDate = new Date();
            tDate = tDate.toString();
            for (var i = 0; i < arrayLength; i++) {

            }
        });
},5000);

数据库中的每个条目每5秒钟一次。那么,我如何使用数据库条目检查最旧的一个是否超过1天?

1 个答案:

答案 0 :(得分:1)

您的代码存在一些小问题。

使用setInterval这样的事情是一个糟糕的选择。如果前一个间隔在最后一个尚未完成时仍在运行,会发生什么?这可能没问题,但是对于更复杂的逻辑错误可能会发生。

您最好在没有特定格式的情况下存储日期。使用新的Date()。toJSON()或Date.now()来获得更好的格式,而不必担心时区。

除非数据集(docs)非常小,否则不要使用for循环,否则每次删除写入都会累积到大量的并发写入中(除非你批处理它们)

var moment = require('moment');
var async = require('async');

function deleteDoc(doc, callback) { // Run delete then fire callback }

function deleteOld () {
  // Get start of day in milliseconds
  var startOfToday = moment.utc(moment().format('YYYY-MM-DD')).valueOf();

  db.find({$lt: {date: startOfTheDay}}).sort({ number: -1 }).exec(function (err, docs) {
    async.eachSeries(docs, deleteDoc, function (err) {
      if (err) console.log(err)

      setTimeout(deleteOld, 5000);
    });
  })
}

deleteOld()

假设您使用Date.now()方法作为“date”,上面只返回日期条目并删除它们。