我是数据存储的初学者,我遇到了索引问题,希望你们能帮忙解决。我正在使用名为 Program 的 google.cloud.nbd 模型,我想检查
contact_email
是否不为空,并且属性
claimer_digest_email_frequency
的值是否在值列表中。该 Python 代码如下所示:
matching_programs_keys = Program.query(
Program.contact_email != None,
Program.claimer_digest_email_frequency.IN(possible_values),
).fetch(keys_only=True)
尽管我已经在我正在使用的项目中对属性进行了索引,但我仍然遇到索引错误。有什么想法吗?我是否为该查询正确创建了索引?还有其他问题吗?
Google Cloud Datastore UI 中的索引
遇到的索引错误是因为数据存储区不支持使用“IN”运算符和不等式过滤器(如“!= None”)进行的查询。尽管已为属性创建了索引,但数据存储区无法将这些索引与尝试运行的特定查询结合使用。
要解决此问题,需要修改查询并确保它符合数据存储区索引规则。以下是一些选项:
选项 1:使用多个查询并合并结果
可以将查询拆分为多个查询,每个查询检查“claimer_digest_email_frequency”的一个值,然后合并结果:
matching_programs_keys = []
for value in possible_values:
keys = Program.query(
Program.contact_email != None,
Program.claimer_digest_email_frequency == value
).fetch(keys_only=True)
matching_programs_keys.extend(keys)
此方法将为每个“possible_values”执行单独的查询,并使用“==”运算符,这受数据存储区索引支持。
选项 2:使用不等式过滤器对“claimer_digest_email_frequency”进行建模
如果“possible_values”的列表很小且值范围有限,则可以考虑使用不等式过滤器重构数据模型。例如,如果“possible_values”是频率范围,则可以使用“claimer_digest_email_frequency_min”和“claimer_digest_email_frequency_max”属性。然后,的查询将如下所示:
matching_programs_keys = Program.query(
Program.contact_email != None,
Program.claimer_digest_email_frequency_min <= max(possible_values),
Program.claimer_digest_email_frequency_max >= min(possible_values)
).fetch(keys_only=True)
此方法需要更改数据模型,但它允许使用单个查询来检索所需的结果。
选项 3:如果合适,使用 Firestore
如果的应用程序需要更复杂的查询功能并且数据存储区索引限制过于严格,则可以考虑使用 Cloud Firestore 作为数据库。Firestore 支持更广泛的查询运算符和索引选项,包括“IN”运算符和不等式过滤器组合。
请记住,在更改数据模型或选择其他数据库技术之前,请仔细评估每个选项的权衡。
标签:python,google-cloud-platform,google-cloud-datastore From: 78780912