Python 我们如何计算Google App Engine上实体属性的不同值?

Python 我们如何计算Google App Engine上实体属性的不同值?,python,google-app-engine,count,distinct,Python,Google App Engine,Count,Distinct,我正在尝试获取google app engine高复制数据存储上的投影属性的不同计数。 我的部分模型如下所示: class Hit(ndb.Model): accountId = ndb.StringProperty(indexed=True) sessionId = ndb.StringProperty(indexed=True) pageId = ndb.StringProperty(indexed=True) Hit.query(ndb.AND(Hit.accountId =

我正在尝试获取google app engine高复制数据存储上的投影属性的不同计数。 我的部分模型如下所示:

class Hit(ndb.Model):
  accountId = ndb.StringProperty(indexed=True)
  sessionId = ndb.StringProperty(indexed=True)
  pageId = ndb.StringProperty(indexed=True)
Hit.query(ndb.AND(Hit.accountId == "acct1", ndb.OR(Hit.pageId == "page1", Hit.pageId == "page2")), projection=['sessionId'], distinct=True).count()
len(Hit.query(ndb.AND(Hit.accountId == "acct1", ndb.OR(Hit.pageId == "page1", Hit.pageId == "page2")), projection=['sessionId'], distinct=True).fetch())
因此,该模型将来自不同会话的所有点击存储到一个页面。 我想要的是不同会话的计数,对于给定的accountId,这些会话至少有两个特定PageID中的一个

我想要的查询如下:

class Hit(ndb.Model):
  accountId = ndb.StringProperty(indexed=True)
  sessionId = ndb.StringProperty(indexed=True)
  pageId = ndb.StringProperty(indexed=True)
Hit.query(ndb.AND(Hit.accountId == "acct1", ndb.OR(Hit.pageId == "page1", Hit.pageId == "page2")), projection=['sessionId'], distinct=True).count()
len(Hit.query(ndb.AND(Hit.accountId == "acct1", ndb.OR(Hit.pageId == "page1", Hit.pageId == "page2")), projection=['sessionId'], distinct=True).fetch())
但是,这会返回一个异常: BadRequestError:无法在没有投影的情况下指定group_by

所以,我试着这样做:

class Hit(ndb.Model):
  accountId = ndb.StringProperty(indexed=True)
  sessionId = ndb.StringProperty(indexed=True)
  pageId = ndb.StringProperty(indexed=True)
Hit.query(ndb.AND(Hit.accountId == "acct1", ndb.OR(Hit.pageId == "page1", Hit.pageId == "page2")), projection=['sessionId'], distinct=True).count()
len(Hit.query(ndb.AND(Hit.accountId == "acct1", ndb.OR(Hit.pageId == "page1", Hit.pageId == "page2")), projection=['sessionId'], distinct=True).fetch())
不幸的是,此查询统计重复的“sessionId”!(即,它不返回不同的值) e、 g.对于以下实体:

accountId    sessionId     pageId
---------    ---------     ------
acct1        sess1         page1
acct1        sess1         page2
我希望得到一个结果“1”,但查询返回“2”,尽管我试图获得不同sessionid的计数! 我知道我可以使用set()来过滤重复的sessionid,但在这种情况下,我必须迭代所有结果,这不是最好的,因为实体的数量非常多。 我看到过一些帖子说这不能在GAE上实现。 嗯,这对我来说很奇怪,因为如果我只用一个

Hit.pageID == "<page_id>" 
Hit.pageID==“”
在上面的查询中,它工作正常,不会像预期的那样计算重复的sessionid。所以,我不明白为什么它在我的例子中返回不正确的结果

欢迎发表任何评论和想法。

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

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


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

谢谢@dragonx,但不幸的是,我需要所有pageId对的所有计数。如果我想单独存储计数值,我将不得不存储大量数据(例如,unique_pageIds x(unique_pageIds-1)实体;考虑到一个帐户有约10000个唯一页面,那么每个帐户将有约1亿个实体(!),这是我不喜欢的。