获取一组实体中使用的所有唯一标签的列表
我有两个模型:Group
和 Item
。 Item
具有标签列表并属于Group
。
class Group(db.Model):
name = db.StringProperty()
class Item(db.Model):
title = db.StringProperty()
tags = db.StringListProperty()
group = db.ReferenceProperty(Group)
到目前为止,典型的操作包括向 Item
添加标签、从 Item
中删除标签以及显示与给定 Item
匹配的所有 Item
。代码>组和标签。
获取 Group
中使用的所有唯一标签的列表的好方法是什么?
理想情况下,我希望在 Group
中有一个属性反映所使用的标签:
class Group(db.Model):
name = db.StringProperty()
aggregated_tags = db.StringListProperty()
如果包含具有此标签的 Item
数量,那就更好了。
永久一致性不是必需的,即,如果聚合的标签列表与实际使用的标签列表不匹配也没关系,只要它们最终变得一致即可。
Item
和 Group
不在同一个实体组中,因此我无法进行更新 Item
和 Group 的事务
同时。
I've got two models: Group
and Item
. An Item
has a list of tags and belongs to a Group
.
class Group(db.Model):
name = db.StringProperty()
class Item(db.Model):
title = db.StringProperty()
tags = db.StringListProperty()
group = db.ReferenceProperty(Group)
So far, typical actions are adding a tag to an Item
, removing a tag from an Item
, and showing all Item
s matching a given Group
and tag.
What's a good way for getting a list of all unique tags used within a Group
?
Ideally I'd like to have a property in Group
that reflects the tags used:
class Group(db.Model):
name = db.StringProperty()
aggregated_tags = db.StringListProperty()
It would be even better if this included the number of Item
s that have this tag.
Permanent consistency is not a requirement, i.e. it is fine if the aggregated list of tags does not match the actual list of tags in use, as long as they become consistent eventually.
Item
and Group
are not in the same entity group, so I can't have a transaction that updates the Item
and the Group
at the same time.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
最好的方法是自己维护。每当您在项目中添加或删除标签时,都会更新标签列表。如果您想异步执行此操作,可以在任务队列任务中执行此操作。
或者,您可以编写一个定期运行的 MapReduce,重新计算每个组的标签集 - 事实上,这几乎是 MapReduce 的经典用例。
The best way to do this is to maintain it yourself. Update the list of tags whenever you add or remove one from an item. You can do this in a task queue task if you want to do it asynchronously.
Alternatively, you could write a mapreduce that you run periodically that recalculates the tag set for every group - in fact, this is pretty much a classic use-case for mapreduce.