我正在创建一个使用此数据库管理器的node.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天?
答案 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”,上面只返回日期条目并删除它们。