我在app引擎中有实体,我查询为:
foo = Foo.all().filter('bar =', baz).get()
#baz is unicode, bar is a StringProperty
#Foo inherits from db.Model
这适用于大多数实体,但对于baz的某些值,即使实体确实存在,也不会返回任何实体,因为可以在https://console.cloud.google.com/datastore/entities/验证。原因是该特定实体< / em> bar
的值没有索引,正如“索引”中没有选中标记所证明的那样。该网页上的专栏。
docs状态
自动创建简单查询的索引,例如单个属性上的查询
所以我原以为该类型的所有实体都会在该属性上有一个索引,但显然这是不正确的。问题:
Q1:创建索引时,它是否添加到第一次使用该索引运行查询之前放置的实体? (或者是第一次放置该类型的任何实体时创建的索引?)
Q2:如果没有,实体的更改(如果有的话)将导致索引被添加到该属性? (我尝试更改bar以外的属性,放置,并且不会导致添加实体)
问题3:明确列出index.yaml
中的索引会改变这种行为吗?
问题4:有没有办法以编程方式确定某个实体是否有特定属性的索引?
问题5 :(奖金)是否有关于上述内容的谷歌文档?
感谢
答案 0 :(得分:3)
Q1)当您编写具有该属性的第一个实体(indexed = true)时,将自动创建单个属性的索引。但是,是否将属性添加到索引是在写入时设置的实体/属性级别属性。
Q2)每个属性都有一个标志,告诉后端是否应该索引属性。如果你读取实体并将其写回bar
上的标志设置为true,它将被插入进入指数。
Q3)index.yaml
仅适用于复合索引(多属性索引)。当您编写/更新实体并且不需要预先配置时,各个属性由属性级别标志控制。
Q4)只有回读每个实体并检查相关财产的索引标志。
Q5)对于复合索引,您可以阅读Datastore Indexes。对于属性索引,请阅读“属性和值类型”部分中的Entities, Properties, and Keys page - 您将看到很多有关索引的内容。
答案 1 :(得分:1)
您要存储的数据的长度是多少? Documentation说:
短字符串(最多1500个字节)被编入索引,可用于查询过滤条件和排序顺序。
长字符串(最多1兆字节)未编入索引,无法在查询过滤器和排序顺序中使用。
有关索引创建的更多信息here及其“相关文章”。