9

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

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

我尝试了以下查询

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')
4

3 回答 3

8

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

以下应该工作。在我非常相似的用例中确实如此。

select from testresult where 'ignore' in testcases.type
于 2015-02-05T04:12:15.657 回答
1

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

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'

仅选择 type = 'ignore' 的不同测试用例。结果是测试用例。为了获得整个文档,我们将这些测试用例与每个文档中包含的测试用例($tmp.value 中的测试用例)进行匹配。

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

于 2013-10-08T10:26:31.520 回答
0

尝试

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

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

例如,我们有一个名为 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"
      }]
    }
  ]
}

希望能帮助到你!!。

问候。

于 2012-07-12T11:27:21.967 回答