1

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

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: cannot specify group_by without a projection

所以,我试着这样做:

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”,尽管我正在尝试获取不同 sessionIds 的计数!我知道我可以使用 set() 来过滤重复的 sessionId,但在这种情况下,我必须遍历所有结果,这并不可取,因为实体的数量非常多。我看过帖子说这不能在 GAE 上完成。好吧,这对我来说很奇怪,因为如果我只使用一个

Hit.pageID == "<page_id>" 

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

欢迎任何意见,想法。

4

1 回答 1

0

.count() 仅返回返回的实体数,并且当 pageId 不同时您有单独的实体,因此一切看起来都按设计运行。

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

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

于 2013-11-12T15:39:04.513 回答