ArangoDB 用于打印值数组的Arango DB筛选器查询

xoshrz7s  于 2022-12-09  发布在  Go
关注(0)|答案(1)|浏览(133)

给定以下文档结构:

{
"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

我有电信和名称数组。我想查询比较,如果名称[*]。使用=='官方'然后打印相应的给予数组。

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

ie3xauqp

ie3xauqp1#

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快。
可能会有多个'official'元素,这可能需要额外的数组嵌套级别。上面的查询生成:

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

如果您知道只有一个元素或明确地将其限制为一个元素,则可以使用FIRST()FLATTEN()去掉其中一个方括号。

相关问题