Datastore查询技巧:如何获取无(Null)祖先的Foo实体?
查询Datastore中无祖先的Foo实体
不用全量获取后手动过滤,有两种更高效的方法:
方法1:使用GQL的KEY_PATH_LENGTH函数
Datastore中,无祖先的实体(根实体)的键路径长度为1(仅包含自身的kind和ID/name),而有祖先的实体路径长度大于1。可以通过这个特性过滤:
SELECT * FROM Foo WHERE KEY_PATH_LENGTH(__key__) = 1
方法2:通过客户端SDK过滤键的父级
不同语言的SDK提供了直接过滤键父级的方式,举几个常见例子:
- Python(google-cloud-datastore):
from google.cloud import datastore client = datastore.Client() query = client.query(kind="Foo") # 过滤无父级的实体 query.add_filter("__key__", ">=", datastore.Key("Foo", None)) query.add_filter("__key__", "<", datastore.Key("Foo", "")) results = list(query.fetch()) - Python(NDB):
from google.cloud.ndb import Model class Foo(Model): # 实体定义 pass query = Foo.query(Foo.key.parent() == None) results = query.fetch()
为什么你的GQL语句报错
HAS ANCESTOR语法要求必须传入一个有效的实体键,不能用NULL,所以你之前的写法会触发400: HAS_ANCESTOR requires a key value错误。
内容的提问来源于stack exchange,提问作者Gillespie
相关产品推荐
相关产品推荐

