查询嵌入列表OrientDB
我在我的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')
我知道这是一个老问题,但我有同样的问题,只是在stubled这里的答案: https://www.mail-archive.com/[email protected]/msg00662.html
以下应该工作。它在我非常类似的用例中有所表现。
select from testresult where 'ignore' in testcases.type
尝试
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"
}]
}
]
}
希望它可以帮助!。
问候。
感谢您的回复。这不幸并没有改善我的情况。只要嵌入式列表包含指向其他文档的链接,建议的查询就可以完美工作,但当列表中的对象只是值时,即不提供结果。当我更新我的问题时,我遇到过同样的情况。你是否死了 - 确定你的IsoCodes属性不是数据库中的单独文档? – Henrik 2012-07-12 14:17:50
我有类似的问题,结束了:
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中的测试用例)匹配。
我不知道是否有更简单的方法来查询嵌入式列表...
我遇到了同样的问题。您可以在问题中发布更新并接受它。那正是我正在寻找的。 – 2014-11-05 15:08:04
@DavidLaberge:谢谢你的建议。这个问题太古老了,我坦率地没有完全记住它的背景,所以我会对这个操作感到有些不安。至少根据OrientDB的文档,我还有一种感觉,即我的初始方法应该起作用,所以鼓励人们像上面那样重新调整数据库会是一种错误。 – Henrik 2014-11-05 18:12:25