给定以下文档结构:
{
"name": [
{
"use": "official",
"family": "Chalmers",
"given": [
"Peter",
"James"
]
},
{
"use": "usual",
"given": [
"Jim"
]
},
{
"use": "maiden",
"family": "Windsor",
"given": [
"Peter",
"James"
]
}
]
}
查询:FOR client IN Patient FILTER client.name[*].use=='official' RETURN client.name[*].given
我有电信和名称阵列。我想查询比较一下name[*].use=='official',然后打印相应的给定数组。
预期结果:";给定":["Peter";,"詹姆斯;]
client.name[*].use
是一个数组,因此需要使用数组运算符。它可以是以下任意一种:
'string' in doc.attribute
doc.attribute ANY == 'string'
doc.attribute ANY IN ['string']
要只返回'official'数组中的给定名称,可以使用子查询:
RETURN { given:
FIRST(FOR name IN client.name FILTER name.use == 'official' LIMIT 1 RETURN name.given)
}
或者,您可以使用内联表达式:
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",
"given": [
"Peter",
"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()
去掉其中一个包装方括号。