根据mongoengine / pymongo中的时间戳按小时/天/月的总和

时间:2018-08-02 16:15:07

标签: python-3.x mongodb aggregation-framework mongoengine

起初-我是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插入一些表达式?

我将非常感谢您的帮助。

1 个答案:

答案 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'},
            }
        }
    }
)