如何在ndb中按总和查询
how to query by sum in ndb
我正在尝试在我的网站中构建某种 KPI,并为如何检索数据而苦苦挣扎。
例如,假设我正在构建一个模型为 :
的博客
class MyPost(ndb.Model):
Author = ndb.KeyProperty(MyUser, required = True)
when = TZDateTimeProperty(required = True)
status = ndb.IntegerProperty(default = 1) # 1=draft, 2=published
text = ndb.TextProperty()
我想构建一个查询来列出我的顶级作者,这会给我一个结果(最好排序)
['Jack':10, 'Jane':8, 'Joe',0]
我可以想到两种方法:
- query().fetch() 所有项目然后手动计数
这是非常低效但最灵活的
- 对于用户中的作者:result[author]=query(...).fetch().count()
马马虎虎的效率,并且需要提前知道我的索引(如果我想通过 "author's favorit pet"
查询将不起作用
哪个更好?
您会推荐哪些其他方法?
我建议对 MyUser
模型进行去规范化,即引入冗余,通过给 MyUser
一个 IntegerProperty
,比如 numposts
,冗余地保持跟踪用户创作了多少 MyPost
个实体。在 NoSQL 数据存储中经常需要反规范化。
您为这种适度的去规范化付出的代价是添加一个新的 post 需要更多的工作,因为当发生这种情况时您还需要增加作者的 numposts
。然而,数据存储通常是 "read mostly" —— 与查询现有实体相比,添加新实体的情况相对较少。反规范化的目的是使后者 activity 对于重要的查询更加有效,而前者 activity.
的成本适中。
我正在尝试在我的网站中构建某种 KPI,并为如何检索数据而苦苦挣扎。 例如,假设我正在构建一个模型为 :
的博客class MyPost(ndb.Model):
Author = ndb.KeyProperty(MyUser, required = True)
when = TZDateTimeProperty(required = True)
status = ndb.IntegerProperty(default = 1) # 1=draft, 2=published
text = ndb.TextProperty()
我想构建一个查询来列出我的顶级作者,这会给我一个结果(最好排序)
['Jack':10, 'Jane':8, 'Joe',0]
我可以想到两种方法:
- query().fetch() 所有项目然后手动计数 这是非常低效但最灵活的
- 对于用户中的作者:result[author]=query(...).fetch().count() 马马虎虎的效率,并且需要提前知道我的索引(如果我想通过 "author's favorit pet" 查询将不起作用
哪个更好?
您会推荐哪些其他方法?
我建议对 MyUser
模型进行去规范化,即引入冗余,通过给 MyUser
一个 IntegerProperty
,比如 numposts
,冗余地保持跟踪用户创作了多少 MyPost
个实体。在 NoSQL 数据存储中经常需要反规范化。
您为这种适度的去规范化付出的代价是添加一个新的 post 需要更多的工作,因为当发生这种情况时您还需要增加作者的 numposts
。然而,数据存储通常是 "read mostly" —— 与查询现有实体相比,添加新实体的情况相对较少。反规范化的目的是使后者 activity 对于重要的查询更加有效,而前者 activity.