2012-07-06 3 views
9

에 (버전 1.0.1) 포함 된 목록을 조회 :은 대부분이 같은 구조로, 내 OrientDB 데이터베이스에 문서가 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" 
     } 
    ] 
} 

어떻게 예를 들어, 전체 목록을 통해 조회 할 수 있습니다. "ignore"유형의 테스트 케이스를 포함하는 모든 문서를 찾고 싶다면 어떻게해야합니까?

나는 다음과 같은 쿼리

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

을 시도했지만 이것은 NumberFormatException 발생합니다.

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

작동하지만 분명히 각 문서의 첫 번째 목록 요소 만 봅니다.

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

결과를 제공하지는 않지만 쿼리가 유효한 것으로 간주됩니다.

업데이트 : 다음 쿼리는 테스트 사례가 포함 된 목록 대신 별도의 문서로 저장되는 경우 의도 한대로 작동합니다.

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

동일한 문제가 발생했습니다. 질문에 업데이트를 게시하고 동의 할 수 있습니다. 그게 내가 찾고 있던거야. –

+0

@DavidLaberge : 제안에 감사드립니다. 그 질문은 너무 오래되어 솔직히 그 상황을 완전히 기억하지 못하기 때문에 그 기동에 대해 조금 불안해합니다. OrientalDB의 문서에 따르면 초기 접근 방식이 작동해야한다는 생각이 들기 때문에 위와 같이 사람들이 데이터베이스를 재구성하도록 장려하는 것은 잘못되었습니다. – Henrik

답변

7

나는이 오래된 질문 알고 있지만 나도 같은 문제를했고, 여기에 대한 답변에 stubled : https://www.mail-archive.com/[email protected]/msg00662.html

다음은 작동합니다. 그것은 매우 유사한 경우에 사용됩니다.

select from testresult where 'ignore' in testcases.type 
0

이송 연산자 (https://groups.google.com/forum/?fromgroups#!topic/orient-database/zoBGmIg85o4)가 fetchplan을 사용하는 방법을 알고하거나 "여기서"후 대신을 testcases의) (하나를 넣어

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

확인하십시오.

예를 들어 Country라는 클래스에 isoCodes가있는 embeddedlist 속성이 있습니다. 우리는 다음과 같은 쿼리를 시도 할 경우 :

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

Orientdb 나머지 인터페이스는 다음과 같은 기능을 제공합니다

{ 
    "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" 
     }] 
    } 
    ] 
} 

는 희망이 도움이!.

감사합니다.

+1

답장을 보내 주셔서 감사합니다. 불행히도 내 상황을 개선하지 못했습니다. 제안 된 쿼리는 포함 된 목록에 다른 문서에 대한 링크가 포함되어 있으면 완벽하게 작동하지만 목록의 개체가 값일 경우 결과가 제공되지 않습니다. 내 질문을 업데이트했을 때와 같은 상황. IsoCodes 속성이 데이터베이스의 개별 문서가 아니라는 점을 확신하지 못합니까? – Henrik

1

나는 비슷한 문제를 가지고와 끝까지이 당신에게 유형은 무시 적어도 하나 개의 테스트 케이스가 포함 된 모든 testresult 문서를 줄 것이다

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

. 이 쿼리는 포함 된 목록에서 작동합니다. OrientDB> = 1.4.0에서 확장 기능을 사용할 수 있습니다.

내부 쿼리

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

은 '무시'= 타입 만 다른을 testcases를 선택합니다. 결과는 테스트 케이스입니다. 전체 문서를 갖기 위해 각 테스트 케이스를 각 문서에 포함 된 것과 일치시킵니다 ($ tmp.value의 테스트 케이스).

삽입 된 목록을 쿼리하는 간단한 방법이 있는지 모르겠습니다 ...

관련 문제