【问题标题】:ArangoDB search by string fieldArangoDB 按字符串字段搜索
【发布时间】:2015-07-31 02:41:09
【问题描述】:

我想在 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”我的搜索字符串的程序。我怎样才能做到这一点?

【问题讨论】:

    标签: json arangodb foxx


    【解决方案1】:

    ArangoDB 以与 SQL 类似的方式进行匹配。但是,您必须解决要在以下位置执行 LIKE 的字段: (你必须有一个顶级的对象,具有强制属性 _key 等)

    FOR document IN myCollection
      FILTER LIKE(document.procedures.name, '%hemogram%')
      RETURN document;
    

    【讨论】:

    • 我的查询的想法是这样的,但是你给我的语句是返回一个错误。 “程序”是我的文档(诊所)的一个数组字段,里面有对象,这些对象有一些字段,其中一个是我要查询的字符串字段。
    【解决方案2】:

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

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

    如果要保留当前数据模型,请使用以下 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() 发现多个过程,将返回多个结果。您可以在FILTER 下方将LIMIT 这个1,但这可能不是我们所希望的。

    要改为返回单个结果,将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}
        )
    

    【讨论】:

      猜你喜欢
      • 2011-06-03
      • 2021-04-25
      • 2020-11-16
      • 2014-01-07
      • 1970-01-01
      • 2018-10-08
      • 2012-11-10
      • 2012-12-24
      • 1970-01-01
      相关资源
      最近更新 更多