我们有一类Google App Engine(在Python中),其中字段is_admin未编入索引。我们希望它现在被编入索引,以便我们可以按角色过滤用户 - 管理员或非管理员(is_admin true或false)。原来的课是这样的:
class DomainUser(db.Expando, ExpandoEntity, SocialIconsEntity):
"""
User domain DB Model
"""
domain = db.StringProperty(required=True)
...
is_admin = db.BooleanProperty(default=False, indexed=False)
...
我改为:
class DomainUser(db.Expando, ExpandoEntity, SocialIconsEntity):
"""
User domain DB Model
"""
domain = db.StringProperty(required=True)
...
is_admin = db.BooleanProperty(default=False)
...
但我在文档中读到,我们必须再次保存每个对象以创建索引。是否可以在不保存所有对象的情况下创建索引?我们按特定域筛选所有用户,然后按is_admin字段筛选(或排序)。我们可以为index.yaml添加索引吗?目前,如果我们按is_admin过滤用户,则会收到空结果。
答案 0 :(得分:1)
您列出的两个选项几乎就是您所获得的:
使用索引:在删除indexed=False
的情况下重新保存所有实体(可能非常昂贵,但只有在您拥有大量现有DomainUser
实体时才有一次)。
根本不使用索引:仅通过domain
属性进行查询并在python中过滤结果(如果每个domain
中有大量用户,则每次都可能非常昂贵,具体取决于您运行查询的频率,即:
all_users = DomainUser.query(DomainUser.domain == 'xxx').fetch()
admins = [u for u in all_users if u.is_admin]
users = [u for u in all_users if not u.is_admin]
你需要自己决定哪个选项会更便宜/更快,如果这就是你所追求的。