【发布时间】: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