2010-09-06 11 views
8

Quando si modificano i modelli dati nel motore dell'app per aggiungere nuove proprietà, quelle voci senza una determinata proprietà sono elencate con il valore <missing> nel visualizzatore dati online.Query GQL per <missing>

Quello che mi chiedo è come posso scrivere una query per trovare quelle voci?

risposta

8

Non esiste un modo diretto per eseguire query per le entità precedenti con attributo mancante, ma è possibile progettare il modello di dati in anticipo per supportarlo. Aggiungi un attributo version a ciascuna classe del modello. La versione dovrebbe avere un valore predefinito, che viene aumentato ogni volta che la classe del modello viene modificata e distribuita. In questo modo sarai in grado di interrogare le entità per numero di versione.

+0

Hmm ... ora se solo avessi pensato a questo prima. Probabilmente sarebbe una buona idea implementare ora :) –

4

Non c'è modo di interrogare il datastore per entità che non hanno una determinata proprietà. Devi eseguire un'iterazione su tutte le entità e controllarle tutte, possibilmente utilizzando lo mapreduce API.

0

Oppure è possibile creare uno script per bloccare null in là per tutti gli elementi correnti che non dispongono di tale proprietà utilizzando l'API di datastore di basso livello, quindi è possibile eseguire una query su null.

Ho avuto questo problema ed è così che ho risolto. Il codice approssimativo sarebbe:

DatastoreService datastore = DatastoreServiceFactory.getDatastoreService(); 
     Query query = new Query("JDOObjectType"); 
     List<Entity> results = datastore.prepare(query).asList(FetchOptions.Builder.withLimit(9999)); 

     for (Entity lObject : results) { 
      Object lProperty = lObject.getProperty("YOUR_PROPERTY"); 
      if (lProperty == null) { 
       lObject.setProperty("YOUR_PROPERTY", null); 
       datastore.put(lProperty); 
      } 
     } 

    }