0

我的模型有一些奇怪的行为。

我有事件模型,它跟踪事件。还有一个“聚合”模型,它存储模型 A 的记录聚合,按日期分组。

class Event(ndb.Model):
    user = ndb.KeyProperty(kind=UserProfile)
    date = ndb.DateTimeProperty(auto_now_add=True)
    event_type = ndb.StringProperty()
    is_aggregated = ndb.BooleanProperty(default=False)

class Aggregate(ndb.Model):
    user = ndb.KeyProperty(kind=UserProfile)
    date = ndb.DateProperty()
    aggregates = ndb.PickleProperty(default={})

Event有一个aggregate()方法,像这样:

def aggregate(self):
    if self.is_aggregated:
        # already aggregated
        return

    # get an existing aggregate
    agg = Aggregate.query(
        Aggregate.user == self.user,
        Aggregate.date == self.date.date()
    ).get()
    if not agg:
        # or create a new one
        agg = Aggregate(
            user=self.user,
            date=self.date.date()
        )
        agg.put()

    # update aggregate's count
    if self.event_type not in agg.aggregates.keys():
        agg.aggregates[self.event_type] = 0
    agg.aggregates[self.event_type] += 1
    agg.put()

    # mark this as aggregated
    self.is_aggregated = True
    self.put()

现在,在我的处理程序中,每次Event创建一个新的时,我都会调用它的aggregate方法。但数字有一些出入。

例如,我有 20Eventdate介于2013-10-10 00:00:002013-10-10 23:59:59和之间的记录event_type = "add",它们都有is_aggregated = True. 这意味着该aggregate方法为每个成功执行。

但是当我用 来查看相应的Aggregate记录时date = 2013-10-10,该aggregates属性没有反映 20 个"add"事件。它只有 16 个。

什么会导致这样的差异?怎么会self.put()成功agg.put()却不成功?

4

1 回答 1

3

我想您已经面临最终一致性功能。每次查询聚合模型时,都可以从不同的数据中心检索它,这些数据中心可能包含稍微不同的聚合版本。特别是如果您的事件模型创建得足够快。

我会这样做:根据用户和日期手动组合聚合模型的字符串 ID,然后通过 Aggregate.get_by_id() 通过此 ID 获取它(我假设用户有 id):

# get an existing aggregate
agg_id = str(user.id) + '@' + self.date.date().strftime("%m/%d/%Y")
agg = Aggregate.get_by_id(agg_id)
if not agg:
    # or create a new one
    agg = Aggregate(key=ndb.Key(Aggregate, agg_id),
                    user=self.user,
                    date=self.date.date()
    )
    #agg.put() #ALSO, this put is not needed because you has one below
于 2013-10-15T05:23:33.500 回答