当文档中的某些MongoDB
小于date
时,我尝试删除(在导入新文档时)我的new Date()
集合中的某些文档。
每当我导入文档时,我都会检查是否存在需要删除相同STATION_ID
的文档。
现在我使用mongoose这样做:
function doTheStuff(stationid, time, callback) {
OwnMetarDoc.find({
STATION_ID: stationid[0]
}, function(err, entry) {
var isTaf = false;
if (entry[0] != undefined) {
if (entry[0].TIME) {
var entryObjectTimerec = entry[0].TIME;
var isTaf = true;
};
var d = new Date;
var month = d.getUTCMonth();
var year = d.getUTCFullYear();
var timeRecConverted = new Date(year, month, parseInt(entryObjectTimerec.substring(0, 2)),
parseInt(entryObjectTimerec.substring(2, 4)), parseInt(entryObjectTimerec.substring(4, 6)));
//The relevant part
if (timeRecConverted.getTime() < new Date() && isTaf == true) {
OwnMetarDoc.remove({
_id: entry[0]._id
}, function(err, result) {
if (err) {
console.log(err);
} else {
console.log('old taf entry removed');
};
});
}
if (typeof callback === 'function') {
callback()
};
};
})
};
但是当我有超过100条&000条目和多个回调时,这会花费太长时间。
有人知道是否有办法快速自动地实现这一目标?
我知道当我必须在Schema中删除一个早于f.e八小时的文档时,该怎么做:
var ownMetarSchema = new Schema({
STATION_ID: String,
TIMERECASDATE: {
type: Date,
expires: 28800
}
})
但我不知道如何用我之前的例子来做这件事。
ps:我对Javascript相对较新,您可能需要更多信息,请问我。
答案 0 :(得分:0)
如果我理解,您想要更新您的文档。你应该阅读mongo文档。这里:http://docs.mongodb.org/manual/tutorial/modify-documents/您可以使用新值替换所有值。希望有所帮助。
答案 1 :(得分:0)
如果你知道你的天气预报有多长,我会假设你会使用TTL
部分。由于您尚未使用TTL
,这意味着您的预测可能是未来一天甚至一个月(仅供讨论)。
您正在查找包含STATION_ID
的所有文档并通过它进行解析。相反,您可以执行以下操作:
如果您的字段date
具有确切的时间戳,则只需运行
db.collection.remove({'date':{'$lt': new Date()} })
http://docs.mongodb.org/manual/reference/method/db.collection.remove/
这将删除日期小于当前日期的所有文档。如果需要,还可以添加station_id字段。但是对于天气,我认为没有必要。
我建议在单独的线程/ cron作业中执行此删除操作,而不是在推送数据时执行此操作。