问题描述
鉴于以下文档结构:
{
"name": [
{
"use": "official","family": "Chalmers","given": [
"Peter","James"
]
},{
"use": "usual","given": [
"Jim"
]
},{
"use": "maiden","family": "Windsor","James"
]
}
]
}
查询:
FOR client IN Patient FILTER client.name[*].use=='official' RETURN client.name[*].given
我有电信和姓名数组。 我想查询比较if name[*].use=='official'然后打印对应的给定数组。
预期结果: “给”:[ “彼得”, “詹姆士” ]
解决方法
client.name[*].use
是一个数组,所以需要使用数组运算符。它可以是以下之一:
'string' in doc.attribute
doc.attribute ANY == 'string'
doc.attribute ANY IN ['string']
要从“官方”数组中只返回给定的名称,您可以使用子查询:
RETURN { given:
FIRST(FOR name IN client.name FILTER name.use == 'official' LIMIT 1 RETURN name.given)
}
或者,您可以使用 inline expression:
FOR client IN Patient
FILTER 'official' IN client.name[*].use
RETURN { given:
FIRST(client.name[* FILTER CURRENT.use == 'official' LIMIT 1 RETURN CURRENT.given])
}
结果:
[
{
"given": [
"Peter","James"
]
}
]
在您的原始帖子中,示例文档和查询不匹配,但采用以下结构:
{
"telecom": [
{
"use": "official","value": "+1 (03) 5555 6473 82"
},{
"use": "mobile","value": "+1 (252) 5555 910 920 3"
}
],"name": [
{
"use": "official","family": "Chalmers","given": [
"Peter","James"
]
},{
"use": "usual","given": [
"Jim"
]
},{
"use": "maiden","family": "Windsor","James"
]
}
]
}
……这是一个可能的查询:
FOR client IN Patient
FILTER LENGTH(client.telecom[* FILTER
CONTAINS(CURRENT.value,"(03) 5555 6473") AND
CURRENT.use == 'official']
)
RETURN {
given: client.name[* FILTER CURRENT.use == 'official' RETURN CURRENT.given]
}
请注意,client.telecom[*].value LIKE "..."
会导致电话号码数组被转换为字符串 "[\"+1 (03) 5555 6473 82\",\"+1 (252) 5555 910 920 3\"]"
,LIKE 操作针对该字符串运行 - 这种工作方式有效,但并不理想。
CONTAINS()
也比 LIKE
快,两边都有 %
通配符。
可能有多个“官方”元素,这可能需要额外的数组嵌套级别。以上查询产生:
[
{
"given": [
[
"Peter","James"
]
]
}
]
如果您知道只有一个元素或明确将其限制为一个元素,那么您可以使用 FIRST()
或 FLATTEN()
去掉其中一个环绕方括号。