2012-04-18 8 views
6

Digamos que tengo entidades A, B y C del mismo tipo, y la situación es la siguiente:¿Cómo puedo consultar solo para descendientes directos?

la entidad A es el padre de la Entidad B entidad B es el padre de la Entidad C

Ahora bien, si Hago la siguiente consulta

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

El resultado contendrá las entidades byc. ¿Hay alguna forma de filtrar c para que solo queden entidades que son descendientes directas? De cualquier manera, aparte de mí revisar los resultados y eliminarlos, quiero decir.

Respuesta

4

La única forma de hacerlo es modificar su esquema, agregando un 'padre' KeyProperty que haga referencia al padre directo de una entidad, luego filtrando en eso.

+4

También tenga en cuenta que el resultado de la consulta de antecedente, de hecho, también contienen un (suponiendo que todos tienen el mismo tipo). También podría tener una propiedad de "nivel" en cada entidad donde la raíz tenga el nivel 0, sus hijos directos tengan el nivel 1, el nivel 2 de sus hijos y la opción o. –

1

En realidad, esto no es compatible en absoluto. La respuesta de Nick funciona, pero solo si puede especificar el tipo de entidad en su consulta que el OP no especificó:

"Las consultas sin tipo no pueden incluir filtros en las propiedades. Sin embargo, pueden filtrar por clave de entidad pasando Entity.KEY_RESERVED_PROPERTY como el nombre de propiedad para el filtro. Los ordenamientos ascendentes en Entity.KEY_RESERVED_PROPERTY también son compatibles. "

+0

Estoy usando la respuesta de Nick y funciona bien. Sin embargo, tuve que pasar al modelo poli. – sorin7486

+0

@ sorin7486 Entonces, ¿está diciendo que ha tenido éxito al hacer una consulta ancestral que incluye un filtro pero NO incluye el tipo? – moin

+0

Contiene un tipo, solo que es el tipo base. Todos mis objetos son diferentes tipos de páginas y todos extienden una clase de página. – sorin7486

0

Esto es un poco tarde, sin embargo ayudará a cualquier persona con el mismo problema.

La solución es primero hacer una consulta de solo teclas y tomar el subconjunto de claves que son descendientes directos.

Con ese subconjunto de claves, puede obtener por lotes las entidades deseadas.

estoy familiarizado con Python, así que aquí tiene un ejemplo en el Go:

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 
} 
Cuestiones relacionadas