2012-07-06 6 views
9

Ho un documento nel mio database OrientDB (versione 1.0.1), con una struttura in gran parte come questa:Interrogare un elenco incorporato in OrientDB

{ 
    "timestamp": "...", 
    "duration": 665, 
    "testcases": [ 
     { 
      "testName": "test01", 
      "type": "ignore", 
      "filename": "tests/test1.js" 
     }, 
     { 
      "iterations": 1, 
      "runningTime": 45, 
      "testName": "test02", 
      "type": "pass", 
      "filename": "tests/test1.js" 
     }, 
     ... 
     { 
      "testName": "test05", 
      "type": "ignore", 
      "filename": "tests/test1.js" 
     } 
    ] 
} 

Come posso interrogare tutta la lista, per esempio. se voglio trovare tutti i documenti che contengono una testcase con il tipo "ignora"?

Ho tentato la seguente query

select from testresult where testcases['type'] = 'ignore' 

ma questo si traduce in un NumberFormatException.

select from testresult where testcases[0]['type'] = 'ignore' 

funziona, ma ovviamente guarda solo il primo elemento dell'elenco di ciascun documento.

select from testresult where testcases contains(type = 'ignore') 

Non fornisce alcun risultato, ma la query è accettata come valida.

Aggiornamento: La seguente query funziona come previsto, se i test sono archiviati come documenti separati anziché come elenco incorporato.

select from testresult where testcases contains (type = 'ignore') 
+0

Ho avuto lo stesso problema che hai fatto. Puoi pubblicare il tuo aggiornamento nella domanda e accettarlo. Era quello che stavo cercando. –

+0

@DavidLaberge: Grazie per il suggerimento. La domanda è così antica che francamente non ricordo completamente il suo contesto, quindi mi sentirei un po 'a disagio per quella manovra. Ho anche la sensazione che il mio approccio iniziale dovrebbe funzionare, almeno secondo la documentazione di OrientDB, quindi sarebbe sbagliato incoraggiare le persone a ristrutturare i loro database come in precedenza. – Henrik

risposta

0

Prova

select from testresult where testcases traverse (type = 'ignore') 

Controllare l'operatore di traslazione (https://groups.google.com/forum/?fromgroups#!topic/orient-database/zoBGmIg85o4) per sapere come utilizzare il fetchplan o mettere qualsiasi() al posto di casi di test appena dopo il "dove".

Ad esempio, abbiamo una classe denominata Paese che ha una proprietà di lista integrata con alcuni dei suoi isoCode. Se tentiamo la seguente query:

select name,description,isoCodes,status from Country where isoCodes traverse (value = 'GB' OR value = 'IT') 

OrientDB interfaccia Riposo prevede:

{ 
    "result": [{ 
     "@type": "d", "@version": 0, 
"name": "Italy", 
    "isoCodes": [ 
    { 
     "@type": "d", "@version": 0, 
    "code": "iso3166-A2", 
    "value": "IT" 
     }, 
    { 
     "@type": "d", "@version": 0, 
    "code": "iso3166-A3", 
    "value": "ITA" 
     }], 
    "status": [ 
    { 
     "@type": "d", "@version": 0, 
    "status": "1", 
    "startingDate": "2012-04-24" 
     }] 
    }, { 
     "@type": "d", "@version": 0, 
"name": "United Kingdom", 
    "isoCodes": [ 
    { 
     "@type": "d", "@version": 0, 
    "code": "iso3166-A2", 
    "value": "GB" 
     }, 
    { 
     "@type": "d", "@version": 0, 
    "code": "iso3166-A3", 
    "value": "GBR" 
     }], 
    "status": [ 
    { 
     "@type": "d", "@version": 0, 
    "status": "1", 
    "startingDate": "2012-04-24" 
     }] 
    } 
    ] 
} 

Speranza che aiuta !!.

Saluti.

+1

Grazie per la risposta. Purtroppo non ha migliorato la mia situazione. La query suggerita funziona perfettamente fintanto che l'elenco incorporato contiene collegamenti ad altri documenti, ma non fornisce risultati quando gli oggetti nell'elenco sono solo valori, es. la stessa situazione che avevo raggiunto quando ho aggiornato la mia domanda. Sei sicuro che le tue proprietà IsoCodes non siano documenti separati nel tuo database? – Henrik

1

Ho problemi simili e finire con:

select * from testresult 
    let $tmp = (select from 
    (select expand(testcases) from testresult) 
    where 
    value.type = 'ignore') 
where 
    testcases in $tmp.value 

questo vi darà tutti i documenti TestResult che contiene almeno un testcase quale tipo è ignorare. Questa query funziona sugli elenchi incorporati. Fare attenzione che la funzione di espansione sia disponibile in OrientDB> = 1.4.0.

La query interna:

select from (select expand(testcases) from testresult) where value.type='ignore' 

selezionare solo le diverse testcases con un tipo = 'ignorare'. Il risultato sono testicoli. Per avere l'intero documento, corrispondiamo a quelli testati con quelli contenuti in ciascun documento (test in $ tmp.value).

Non so se c'è un modo più semplice per interrogare l'elenco incorporato ...