首页 文章

按字符串字段搜索ArangoDB

提问于
浏览
1

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

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

我需要搜索对象(文档?)的字符串字段,该字段是数组的一部分,该数组是我的执行文档的字段:

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

例如,我想检索所有名为“字符串”的程序,在我的诊所集合的所有文档中搜索 .

我一直在阅读全文索引,但我无法理解如何创建或如何使用它们 .

任何帮助都会很棒!

EDIT

我几乎得到了我想要的东西 . 我的问题现在只返回我想要的信息 .

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

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

2 回答

  • 0

    ArangoDB以与SQL类似的方式进行匹配 . 但是,您必须处理要执行LIKE的字段:(您必须将对象设置为顶层,具有必需属性_key等)

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

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

    您可以将诊所存储在 clinics 集合中,并将其程序存储在 procedures 集合中(通过分离为两个集合来启用可选的重复数据删除) . 然后通过临床记录中的一系列程序将诊所与诊所联系起来,或者通过边缘收集将临床和程序文件与边缘联系起来 .

    如果要保留当前数据模型,请使用以下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() 找到多个程序,将返回多个结果 . 你可以 LIMIT 这到 1 低于 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}
        )
    

相关问题