【发布时间】:2013-11-22 18:36:53
【问题描述】:
我有以下关于 GAE NDB - 索引的问题。
- 我假设您可以通过
index.yaml或在模型定义中使用属性选项indexed = true指定索引。我对么?如果是的话,一个比另一个更受欢迎? - 有没有办法在数据对象的生命周期中添加/删除索引?
- 能否在结构化属性字段上指定索引? 如果是这样,那么你能告诉我**作为这个的语法吗?
提前致谢
【问题讨论】:
标签: google-app-engine python-2.7
我有以下关于 GAE NDB - 索引的问题。
index.yaml 或在模型定义中使用属性选项indexed = true 指定索引。我对么?如果是的话,一个比另一个更受欢迎?提前致谢
【问题讨论】:
标签: google-app-engine python-2.7
默认情况下,可以索引的属性(即那些不是 Blob 变体的属性)会被索引,这意味着您可以自行过滤或排序。向 index.yaml 添加单一属性索引是不寻常的。为属性设置 indexed=False 将意味着保存实体时的写入操作更少,但意味着不再可以按属性进行过滤或排序。我建议阅读documentation on indexes。
如果您想按多个属性进行过滤或排序(组合),则需要将它们包含在 index.yaml 中。但是,当您在开发服务器中运行代码时,如果它需要尚未指定的索引,则 index.yaml 将被修改为包含正在运行的查询的合适索引。手动添加索引不一定是您必须要做的事情。
您不能为整个 StructuredProperty 编制索引,Structured Properties 的属性是单独编制索引的,与常规属性相比,您无需对它们进行任何不同的考虑。如果您想手动指定包含子属性的多属性索引,那么您应该可以使用“property.subproperty”(例如“address.city”)来实现。
【讨论】:
s1) 是的,您可以将某些属性设置为被索引。某些属性类型根本不允许索引。最好在每个模型定义中以编程方式设置索引。
2) 虽然您可以通过编程方式删除索引(即删除 indexed=True),但我不建议这样做。它会使您的数据存储处于不一致的状态。
3) 无法在结构化属性上设置索引,但是,您可以在模型和结构化属性中的模型之间设置 Key 关系。
见:
https://developers.google.com/appengine/docs/python/ndb/entities
https://developers.google.com/appengine/docs/python/ndb/properties
"您可以为结构化属性指定常用属性选项 (索引除外)。”
【讨论】:
当我发现困难的方式(参见GAE python NDB projection query working in development but not in production)时,拥有索引(因此需要在 index.yaml 中的条目)和将属性标记为已编入索引或未编入索引之间存在很大差异。这些东西有不同的用途:
是的,绝对可以,您可以随时添加或删除索引:
不,您不能在结构化属性上创建索引。在此处查看更多信息https://cloud.google.com/appengine/docs/standard/python/ndb/entity-property-reference#structured
【讨论】: