我怎样才能查询直接后代?

时间:2012-04-18 22:42:20

标签: google-app-engine google-cloud-datastore

假设我有实体a,b和c都是相同的类型,情况是这样的:

实体a是实体b的父级 实体b是实体c的父母

现在,如果我执行以下查询

query = ndb.Query(ancestor=a.key)
result = query.fetch()

结果将包含b和c实体。有没有办法可以过滤掉c,这样才能只保留直接后代的实体?除了我通过结果并删除它们之外的任何方式我的意思是。

3 个答案:

答案 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
}