我正在尝试获取谷歌应用引擎高复制数据存储上的投影属性的不同计数。我的模型的一部分是这样的:
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。所以,我不明白为什么它在我的情况下返回不正确的结果。
欢迎任何意见,想法。