2012-04-18 10 views
6

Diciamo che ho entità A, B e C tutto dello stesso tipo, e la situazione è simile a questo:Come posso interrogare solo i discendenti diretti?

entità A è genitore per l'entità b entità b è capogruppo per l'entità c

Ora, se Faccio la seguente domanda

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

Il risultato conterrà entrambe le entità b e c. C'è un modo in cui posso filtrare c in modo che rimangano solo le entità che sono discendenti diretti? Voglio dire, a prescindere da me che sto esaminando i risultati e rimuovendoli.

risposta

4

L'unico modo per fare ciò è modificare lo schema, aggiungendo un 'genitore' KeyProperty che fa riferimento a un genitore diretto dell'entità, quindi filtrandolo.

+4

Si noti inoltre che il risultato della query antenato sarà infatti contenere anche un (ammesso che tutti hanno lo stesso tipo). Si potrebbe anche avere una proprietà 'livello' in ogni entità in cui la radice ha livello 0, i suoi figli diretti hanno livello 1, i loro figli livello 2 e o on. –

1

In realtà, questo non è supportato affatto. La risposta di Nick funziona ma solo se è possibile specificare il tipo di entità nella query che l'OP non ha specificato:

"Le query senza gentilezza non possono includere filtri sulle proprietà. Tuttavia, possono filtrare in base a Entity Key passando Entity.KEY_RESERVED_PROPERTY come il nome della proprietà per il filtro. Sono supportati anche gli ordinamenti ascendenti su Entity.KEY_RESERVED_PROPERTY. "

+0

Sto usando la risposta di Nick e funziona perfettamente. Dovevo comunque passare al modello in poli. – sorin7486

+0

@ sorin7486 Quindi, stai dicendo che hai avuto successo facendo una query antenato che include un filtro ma NON include il tipo? – moin

+0

Contiene un tipo, solo che è il tipo di base. Tutti i miei oggetti sono diversi tipi di pagine e tutti estendono una classe Page. – sorin7486

0

Questo è un po 'tardi, tuttavia aiuterà qualcuno con lo stesso problema.

La soluzione è innanzitutto eseguire una query solo per le chiavi e utilizzare il sottoinsieme di chiavi che sono discendenti diretti.

Con questo sottoinsieme di chiavi, è possibile ottenere in batch le entità desiderate.

Sono familiarità con pitone, ecco un esempio in movimento:

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 
} 
Problemi correlati