2012-07-06 52 views
9

我在我的OrientDB数据库中的文档(1.0.1版本),在很大程度上与这样的结构:查询嵌入列表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" 
     } 
    ] 
} 

我如何可以查询整个列表,例如。如果我想查找包含类型为“忽略”的测试用例的所有文档?

我已经尝试下面的查询

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

我遇到了同样的问题。您可以在问题中发布更新并接受它。那正是我正在寻找的。 – 2014-11-05 15:08:04

+0

@DavidLaberge:谢谢你的建议。这个问题太古老了,我坦率地没有完全记住它的背景,所以我会对这个操作感到有些不安。至少根据OrientDB的文档,我还有一种感觉,即我的初始方法应该起作用,所以鼓励人们像上面那样重新调整数据库会是一种错误。 – Henrik 2014-11-05 18:12:25

回答

0

尝试

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

检查导线运营商(https://groups.google.com/forum/?fromgroups#!topic/orient-database/zoBGmIg85o4)知道如何使用fetchplan或只是 “在哪里” 后提出的任何(),而不是测试用例的。

例如,我们有一个名为Country的类,它具有一些isoCode的嵌入式列表属性。如果我们尝试以下查询:

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

Orientdb REST接口提供:

{ 
    "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 2012-07-12 14:17:50

1

我有类似的问题,结束了:

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

这会给你所有包含至少一个测试用例哪种类型忽略的TestResult文件。此查询适用于嵌入式列表。请注意,OrientDB> = 1.4.0中提供了扩展功能。

内查询:

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

仅选择不同测试用例与类型= '忽略'。结果是测试用例。为了让整个文档与那些包含在每个文档中的测试用例($ tmp.value中的测试用例)匹配。

我不知道是否有更简单的方法来查询嵌入式列表...