起初-我是mongodb的初学者。所以我有下一个问题。我在 mongoengine 中使用以下模型:
class Stats(Document):
Name = StringField(max_length=250)
timestamp = LongField(default=mktime(datetime.now().timetuple()))
count = IntField()
<some other fields>
我真正想要的是按名称过滤(很明显),并对字段计数使用聚合操作总和。但是我想计算按小时/天/月分组的记录总数。
例如,如果我们有带有此类时间戳记的记录[1532970603、1532972103、153293600、1532974500],则1-2构成第一组,而3-4构成第二组。
那就是我坚持的地方。我有一些关于按每n条记录分组或将时间戳除以3600的一些想法 (1小时= 3600秒),但是如何使用 mongoengine 做到这一点。甚至如何在管道中使用python插入一些表达式?
我将非常感谢您的帮助。
答案 0 :(得分:0)
我建议使用ISO日期格式并将完整日期存储在时间戳中。这是你的模特
class Stats(Document):
Name = Document.StringField(max_length=250)
timestamp = Document.DateTime(default=datetime.utcnow()) //ISO time format recommended
count = Document.FloatField()
meta = {'strict': False}
现在您可以相应地对其进行汇总。
Stats.objects.aggregate(
{
'$group': {
'_id': {'year': {$year: '$timestamp'},
'month': {$month: '$timestamp'},
'day' : {$dayOfMonth: '$timestamp'},
'hour': {'$hour: '$timestamp'},
}
}
}
)