【问题标题】:sum by hours/days/month based on timestamp in mongoengine/pymongo根据 mongoengine/pymongo 中的时间戳按小时/天/月求和
【发布时间】:2019-01-10 11:48:32
【问题描述】:

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

我将非常感谢任何帮助。

【问题讨论】:

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


    【解决方案1】:

    我建议使用 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'},
                }
            }
        }
    )
    

    【讨论】:

    • 感谢您的回答!几天后,我达到了相同的解决方案,忘记了我的问题。对于这种情况,这可能是唯一正确的方法:)从那时起,我对 mongo 本身变得更加友好,因此我可以感受到聚合框架的所有力量。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多