1

我想在 ArangonDB 中特定集合的特定字段中通过文本进行简单搜索。像这样的东西(在 SQL 中):

SELECT * FROM procedures WHERE procedures.name LIKE '%hemogram%'

我需要在作为我的实际文档字段的数组的一部分的对象(文档?)的字符串字段中进行搜索:

[
  {
    "name": "Unimed",
    "procedures": [
      {
        "type": "Exames",
        "name": "Endoscopia"
      },
      {
        "type": "Exame",
        "name": "Hemograma"
      }
    ]
  }
]

例如,我想检索名称像“字符串”的所有程序,在我的诊所集合的所有文档中进行搜索。

我一直在阅读全文索引,但我不明白如何创建或如何使用它们。

任何帮助都会很棒!

编辑

我几乎得到了我想要的。我的问题是现在只返回我想要的信息。

FOR clinic IN clinics
  FILTER LIKE(clinic.procedures[*].name, '%hemogram%', true)
  RETURN{
   clinic_name: clinic.name,
   procedure: clinic.procedures
  }

这会将给定诊所中的所有程序(程序是诊所内的数组)返回给我,而不仅仅是字段名称为“LIKE”我的搜索字符串的程序。我怎样才能做到这一点?

4

2 回答 2

1

ArangoDB 以与 SQL 类似的方式进行匹配。但是,您必须解决要在其上执行LIKE的字段:(您必须将对象作为顶层,具有强制性属性 _key 等)

FOR document IN myCollection
  FILTER LIKE(document.procedures.name, '%hemogram%')
  RETURN document;
于 2015-07-31T09:31:14.260 回答
0

您可能想重新考虑您的数据模型。您的文档存储两种不同类型的实体、诊所和程序。

您可以将诊所存储在一个clinics集合中,并将它们的程序存储在一个procedures集合中(通过分离为两个集合启用可选的重复数据删除)。然后将诊所链接到程序,或者通过诊所记录中的程序数组_id,或者通过使用边缘集合将诊所和程序文档与边缘链接起来。

如果要保留当前数据模型,请使用以下 AQL 查询:

FOR clinic IN clinics
    FOR proc IN clinic.procedures
        FILTER LIKE(proc.name, "%hemo%", true)
        RETURN MERGE(
            UNSET(clinic, "procedures"),
            {procedure: proc}
        )

在您的情况下,不可能使用缩写语法([*]运算符)。

方法是procedures从文档中删除属性,添加新属性procedure和匹配的过程对象作为值。LIKE()问题是,如果发现不止一个过程,将返回多个结果。你可以LIMIT1下面这样做FILTER,但这可能不是我们所希望的。

要返回单个结果,将procedures属性简化为匹配过程,需要子查询:

FOR clinic IN clinics
    LET p = (
        FOR proc IN clinic.procedures
            FILTER LIKE(proc.name, "%hemo%", true)
            RETURN proc
    )

    RETURN MERGE(
        clinic,
        {procedures: p}
    )
于 2015-08-08T16:21:22.790 回答