2012-07-06 31 views
9

Tôi có một tài liệu trong cơ sở dữ liệu OrientDB tôi (phiên bản 1.0.1), với một cấu trúc chủ yếu là như thế này:Truy vấn một danh sách nhúng trong 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" 
     } 
    ] 
} 

Làm thế nào tôi có thể truy vấn trên toàn bộ danh sách, ví dụ. nếu tôi muốn tìm tất cả các tài liệu có chứa một testcase với loại "bỏ qua"?

Tôi đã cố gắng truy vấn sau

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

nhưng kết quả này trong một NumberFormatException.

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

hoạt động, nhưng rõ ràng chỉ xem phần tử danh sách đầu tiên của từng tài liệu.

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

Không cung cấp bất kỳ kết quả nào, nhưng truy vấn được chấp nhận là hợp lệ.

Cập nhật: Truy vấn sau hoạt động như dự định, nếu testcases được lưu trữ dưới dạng tài liệu riêng biệt thay vì dưới dạng danh sách được nhúng.

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

Tôi gặp vấn đề tương tự như bạn đã làm. Bạn có thể đăng cập nhật của bạn trong câu hỏi và chấp nhận nó. Đó là những gì tôi đang tìm kiếm. –

+0

@DavidLaberge: Cảm ơn bạn đã đề xuất. Câu hỏi quá cũ đến nỗi tôi hoàn toàn không hoàn toàn nhớ được bối cảnh của nó, vì vậy tôi sẽ cảm thấy hơi lo lắng về sự điều động đó. Tôi cũng có cảm giác rằng cách tiếp cận ban đầu của tôi phải hoạt động, ít nhất là theo tài liệu hướng dẫn của OrientDB, vì vậy sẽ cảm thấy sai khi khuyến khích mọi người cơ cấu lại cơ sở dữ liệu của họ như ở trên. – Henrik

Trả lời

7

Tôi biết đó là một câu hỏi cũ nhưng tôi có cùng một vấn đề và chỉ stubled khi một câu trả lời ở đây: https://www.mail-archive.com/[email protected]/msg00662.html

Sau đây nên làm việc. Nó trong trường hợp sử dụng rất giống nhau của tôi.

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

Hãy thử

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

Kiểm tra các nhà điều hành traverse (https://groups.google.com/forum/?fromgroups#!topic/orient-database/zoBGmIg85o4) để biết cách sử dụng các fetchplan hoặc đặt bất kỳ() thay vì testcases chỉ sau "ở đâu".

Ví dụ: chúng tôi có một lớp được gọi là Quốc gia có thuộc tính danh sách nhúng với một số mã isoCodes của nó. Nếu chúng ta cố gắng truy vấn sau đây:

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

Orientdb giao diện Nghỉ cung cấp:

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

Hy vọng nó giúp !!.

Trân trọng.

+1

Cảm ơn bạn đã trả lời. Thật không may đã không cải thiện tình hình của tôi. Truy vấn được đề xuất hoạt động hoàn toàn miễn là danh sách được nhúng chứa các liên kết đến các tài liệu khác, nhưng không cung cấp kết quả khi các đối tượng trong danh sách chỉ là các giá trị, nghĩa là. tình huống tương tự tôi đã đạt được khi tôi cập nhật câu hỏi của mình. Bạn có chắc chắn rằng các thuộc tính IsoCodes của bạn không phải là các tài liệu riêng biệt trong cơ sở dữ liệu của bạn không? – Henrik

1

Tôi có vấn đề tương tự và kết thúc với:

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

này sẽ cung cấp cho bạn tất cả các tài liệu testresult có chứa ít nhất một testcase loại là bỏ qua. Truy vấn này hoạt động trên danh sách được nhúng. Chú ý rằng chức năng mở rộng có sẵn trong OrientDB> = 1.4.0.

Truy vấn nội:

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

chỉ chọn testcases khác nhau với một type = 'bỏ qua'. Kết quả là testcases. Để có toàn bộ tài liệu, chúng tôi kết hợp các testcase đó với các tài liệu có trong mỗi tài liệu (testcases trong $ tmp.value).

Tôi không biết nếu có cách đơn giản hơn để truy vấn danh sách được nhúng ...

Các vấn đề liên quan