假设我有实体a,b和c都是相同的类型,情况是这样的:
实体a是实体b的父级 实体b是实体c的父母
现在,如果我执行以下查询
query = ndb.Query(ancestor=a.key)
result = query.fetch()
结果将包含b和c实体。有没有办法可以过滤掉c,这样才能只保留直接后代的实体?除了我通过结果并删除它们之外的任何方式我的意思是。
答案 0 :(得分:4)
执行此操作的唯一方法是修改架构,添加引用实体直接父级的“父级”KeyProperty
,然后对其进行过滤。
答案 1 :(得分:1)
实际上,这根本不受支持。 Nick的答案确实有效,但前提是您可以在查询中指定OP未指定的实体类型:
“无状态查询不能包含属性过滤器。但是,它们可以通过传递Entity.KEY_RESERVED_PROPERTY作为过滤器的属性名称来按实体键过滤。还支持Entity.KEY_RESERVED_PROPERTY上的升序排序。”
答案 2 :(得分:0)
这有点晚了,但它会帮助任何有同样问题的人。
解决方案是首先执行仅密钥查询并获取直接后代的密钥子集。
使用该子集键,您可以批量获取所需的实体。
我对python不熟悉,所以这里有一个例子:
directDescKeys := make([]*datastore.Key, 0)
q := datastore.NewQuery("A").Ancestor(parentKey).KeysOnly()
for it := q.Run(ctx);; {
key, err := it.Next(nil)
if err == datastore.Done {
break
} else if err != nil {
// handle error
}
if reflect.DeepEquals(key.Parent(), parentKey) {
directDescKeys = append(directDescKeys, key)
}
}
entities := make([]*A, len(directDescKeys))
if err := datastore.GetMulti(ctx, directDescKeys, entities); err != nil {
// handle error
}