Arangodb Arango DB筛选器查询打印值数组

Arangodb Arango DB筛选器查询打印值数组,arangodb,aql,Arangodb,Aql,鉴于以下文件结构: { "name": [ { "use": "official", "family": "Chalmers", "given": [ "Peter", "James" ] }, { "use": "usual", "given&qu

鉴于以下文件结构:

{
"name": [
{
  "use": "official",
  "family": "Chalmers",
  "given": [
    "Peter",
    "James"
  ]
},
{
  "use": "usual",
  "given": [
    "Jim"
  ]
},
{
  "use": "maiden",
  "family": "Windsor",
  "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"
      ]
    }
  ]
}
查询:
用于患者筛选客户端中的客户端。名称[*]。使用=='official'返回客户端。名称[*]。给定

我有电信和名称阵列。 我想查询比较名称[]。使用=='official',然后打印相应的give数组

预期结果: “给定”:[ “彼得”, “詹姆斯”
]

客户端。名称[*]。use
是一个数组,因此需要使用数组运算符。它可以是以下任一项:

  • 文档属性中的“字符串”
  • doc.attribute ANY=='string'
  • doc.attribute['string']中的任意属性
要仅从“官方”数组返回给定名称,可以使用子查询:

RETURN { given:
  FIRST(FOR name IN client.name FILTER name.use == 'official' LIMIT 1 RETURN name.given)
}
或者,您可以使用:

结果:

[
  {
    "given": [
      "Peter",
      "James"
    ]
  }
]

在您的原始帖子中,示例文档和查询不匹配,但假设以下结构:

{
"name": [
{
  "use": "official",
  "family": "Chalmers",
  "given": [
    "Peter",
    "James"
  ]
},
{
  "use": "usual",
  "given": [
    "Jim"
  ]
},
{
  "use": "maiden",
  "family": "Windsor",
  "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会将电话号码数组转换为一个字符串
“[\”+1(03)5555 6473 82\”,“\”+1(252)5555 910 920 3\””
,对其运行类似的操作-这类操作有效,但并不理想

CONTAINS()
也比两边都有
%
通配符的

可能存在多个“官方”元素,这可能需要额外级别的数组嵌套。上述查询生成:

[
  {
    "given": [
      [
        "Peter",
        "James"
      ]
    ]
  }
]

如果您知道只有一个元素,或者明确地将其限制为一个元素,那么您可以使用
FIRST()
FLATTEN()
取消其中一个包装方括号,谢谢您的帮助。它工作正常。