查询OrientDB中的嵌入列表

时间:2012-07-06 11:01:50

标签: java orientdb

我的OrientDB数据库(版本1.0.1)中有一个文档,结构很像这样:

{
    "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')

3 个答案:

答案 0 :(得分:7)

我知道这是一个老问题,但我遇到了同样的问题,只是在这里找到了答案: https://www.mail-archive.com/orient-database@googlegroups.com/msg00662.html

以下内容应该有效。它在我非常类似的用例中。

select from testresult where 'ignore' in testcases.type

答案 1 :(得分:1)

我有类似的问题,最终得到:

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

这将为您提供包含至少一个类型为ignore的测试用例的所有testresult文档。此查询适用于嵌入式列表。请注意,OrientDB> = 1.4.0中可以使用扩展功能。

内部查询:

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

仅选择type ='ignore'的不同测试用例。结果是测试用例。要让整个文档与那些测试用例和每个文档中包含的测试用例($ tmp.value中的测试用例)匹配。

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

答案 2 :(得分:0)

尝试

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

检查遍历运算符(https://groups.google.com/forum/?fromgroups#!topic/orient-database/zoBGmIg85o4)以了解如何使用fetchplan或在“where”之后放置any()而不是testcases。

例如,我们有一个名为Country的类,它有一个带有一些isoCodes的embeddedlist属性。如果我们尝试以下查询:

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

希望它有所帮助!!

的问候。