【问题标题】:How can we count the distinct values of an entity property on Google App Engine?我们如何计算 Google App Engine 上实体属性的不同值?
【发布时间】:2013-11-12 14:45:46
【问题描述】:

我正在尝试获取谷歌应用引擎高复制数据存储上的投影属性的不同计数。 我的部分模型是这样的:

class Hit(ndb.Model):
  accountId = ndb.StringProperty(indexed=True)
  sessionId = ndb.StringProperty(indexed=True)
  pageId = ndb.StringProperty(indexed=True)

因此,模型将来自不同会话的所有点击存储到一个页面。 我想要的是不同会话的计数,这些会话至少具有给定 accountId 的 2 个特定 pageId 之一。

我想要的查询是这样的:

Hit.query(ndb.AND(Hit.accountId == "acct1", ndb.OR(Hit.pageId == "page1", Hit.pageId == "page2")), projection=['sessionId'], distinct=True).count()

但是,这会返回一个异常: BadRequestError: 不能在没有投影的情况下指定 group_by

所以,我尝试这样做:

len(Hit.query(ndb.AND(Hit.accountId == "acct1", ndb.OR(Hit.pageId == "page1", Hit.pageId == "page2")), projection=['sessionId'], distinct=True).fetch())

不幸的是,这个查询计算了重复的“sessionId”! (即它不返回不同的值) 例如对于以下实体:

accountId    sessionId     pageId
---------    ---------     ------
acct1        sess1         page1
acct1        sess1         page2

我希望得到“1”的结果,但查询返回“2”,尽管我正在尝试获取不同 sessionId 的计数! 我知道我可以使用 set() 来过滤重复的 sessionId,但在这种情况下,我必须遍历所有结果,这并不可取,因为实体的数量非常多。 我看过帖子说这不能在 GAE 上完成。 好吧,这对我来说很奇怪,因为如果我只使用一个

Hit.pageID == "<page_id>" 

上面查询中的语句,它工作正常,它不会像预期的那样计算重复的 sessionIds。所以,我不明白为什么它在我的情况下返回不正确的结果。

欢迎任何cmets,想法..

【问题讨论】:

    标签: python google-app-engine count distinct


    【解决方案1】:

    .count() 仅返回返回的实体数量,当 pageId 不同时,您将拥有单独的实体,因此一切看起来都像设计的那样。

    最好的方法可能是存储您感兴趣的计数,并在获取页面时更新该计数,然后在需要时专门查询该计数。

    否则,您将需要解析所有实体并手动更新计数。

    【讨论】:

    • 感谢@dragonx,但不幸的是,我需要所有 pageId 对的所有计数。如果我想单独存储计数值,我将不得不存储大量数据(即 unique_pageIds x (unique_pageIds - 1) 个实体;假设一个帐户有大约 10,000 个唯一页面,那么每个帐户将产生大约 1 亿个实体我不喜欢的帐户(!))。
    猜你喜欢
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 2010-11-25
    • 1970-01-01
    • 2015-07-25
    相关资源
    最近更新 更多