我有一个应用程序,每秒都会将数据保存到MongoDB。这是重要的数据,但不需要每秒保持数据。过了一段时间,我想运行一个进程(后台工作者)将这些数据清理成每小时的块,其中包括当天每小时的每一个数据(每秒1个)。有点像Time Machine在Mac上运行。
通过研究和思考,我可以想到几种方法可以实现这一目标:
使用MongoDB执行此操作的最佳方法是什么?
答案 0 :(得分:0)
我认为Date Aggregation Operators可能是您案件的更好选择。鉴于您的架构如下
var dataSchema = new Schema({
// other fields are here...
updated: Date,
});
var Data = mongoose.model('Data', dataSchema );
只需将这些数据保存为正常日期。
然后,您可以通过aggregate operation in mongoose检索每小时的数据块,例如,
MyModel.aggregate([
{$match: {$and: [{updated: {$gte: start_date_hour}}, {updated: {$lte: end_date_hour}}]}},
{$group: {
_id: {
year: {$year: "$updated"},
month: {$month: "$updated"},
day: {$dayOfMonth: "$updated"}
// other fields should be here to meet your requirement
},
}},
{$sort: {"date.year":1, "date.month":1, "date.day":1}}
], callback);
有关aggregate
的更多参数,请参阅此doc。