Arango DB Filter查询值的打印数组



给定以下文档结构:

{
"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()去掉其中一个包装方括号。