簡體   English   中英

如何構建django-mongodb-engine中的時間序列模型

[英]How to Structure Time-Series model in django-mongodb-engine

我正在嘗試使用mongodb作為后端在django中定義時間序列模型。 在MongoDB博客上閱讀了有關時間序列數據的一些最佳實踐 ,我認為我理解得很好。 但現在,我的問題是:如何使用django的模型語法定義這樣的模型? 我不確定這些是embedded documents還是只是在模型字段中存儲arraysdicts 這是建議的mongo格式:

理想的mongo文檔格式:

{
  timestamp_hour: ISODate("2013-10-10T23:00:00.000Z"),
  type: “memory_used”,
  values: {
    0: { 0: 999999, 1: 999999, …, 59: 1000000 },
    1: { 0: 2000000, 1: 2000000, …, 59: 1000000 },
    …,
    58: { 0: 1600000, 1: 1200000, …, 59: 1100000 },
    59: { 0: 1300000, 1: 1400000, …, 59: 1500000 }
  }
}

一種解決方案是做這樣的事情,一份文件包含一天的數據:

# models.py
class timeseries(models.Model):
    date            = models.DateField(null=True)
    value_hour_0    = models.CharField(max_length='1024', blank=True)
    value_hour_1    = models.CharField(max_length='1024', blank=True)
    value_hour_...
    value_hour_23   = models.CharField(max_length='1024', blank=True)

即使我存儲arraysdictsvalue_hour_n領域,它並不完全是您在文章中提到,例如查詢該文檔的優點timeseries.HR.MIN 有什么建議么?

我不能不同意結構是一種理想的格式,我似乎總是把這種符號看作是對如何建模數組的“PHP理解”,但這不適合Mongo的解釋。

由於我在這里詳細介紹的原因,我通常發現以下結構對於查詢目的更靈活:

{
  timestamp_hour: ISODate("2013-10-10T23:00:00.000Z"),
  type: “memory_used”,
  values: [
    [ 999999, 999999, …, 1000000 ],
    [ 2000000, 2000000, …, 1000000 ],
    …,
    [ 1600000, 1200000, …, 1100000 ],
    [ 1300000, 1400000, …, 1500000 ]
  ]
}

這樣(如在另一個答案中所解釋的那樣)你並沒有專門針對路徑的任何部分來獲取任何元素。 子文檔符號是單向的 ,您必須完全指定每個符號,不能做范圍的事情或在不同的位置查找值。

使用你會得到免費的位置標記無論如何陣列,這樣你就可以values.59甚至values.20.15如果你想,否則文件中匹配的密鑰, 在數組中

對於你的解決方案,你需要更多地使用它,但是這個和另一個閱讀提供了一般的要點。

你可以做你寫的,但是如果你想每2小時或每30分鍾存儲一次值呢? 所以這不是一個好習慣

那這個呢 :

class MyModelStat(models.Model):
    #other fields like : nbr_views, nbr_clicks, rates ...
    my_model = models.ForeignKey(MyModel, related_name="stats")
    created_on = models.DateTimeField(auto_now_add=True)
    previous = models.ForeignKey('self', blank=True, null=True, editable=False)

    def save(self, **kwargs):
    current_stats = self.my_model.current_stats
    if current_stats is not None and self.id is None:
        #iterate over the fields, and do your stuff
        self.rates = current_stats.rates + 1 
        self.nbr_views = current_stats.nbr_views
        #set the current stat as the previous for the new stat
        self.previous = self.deal.current_stats
    super(MyModelStat, self).save(**kwargs)



@receiver(post_save, sender=MyModelStat)
def set_mymodel_stats(sender, *args, **kwargs):
"""
Signal handler to ensure that a new stats is always chosen as the current stats - automatically. It simplifies stuff
greatly. Also stores previous revision for diff-purposes
"""
instance = kwargs['instance']
created = kwargs['created']
if created and instance.my_model:
    instance.my_model.current_stats = instance
    instance.my_model.save()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM