Json ArangoDB按字符串字段搜索

Json ArangoDB按字符串字段搜索,json,arangodb,foxx,Json,Arangodb,Foxx,我想在ArangonDB中的特定集合的特定字段中通过文本进行简单搜索。类似于以下内容(在SQL中): 我需要搜索对象(文档?)的字符串字段,该字段是数组的一部分,数组是我实际文档的字段: [ { "name": "Unimed", "procedures": [ { "type": "Exames", "name": "Endoscopia" }, { "type": "Exame",

我想在ArangonDB中的特定集合的特定字段中通过文本进行简单搜索。类似于以下内容(在SQL中):

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

[
  {
    "name": "Unimed",
    "procedures": [
      {
        "type": "Exames",
        "name": "Endoscopia"
      },
      {
        "type": "Exame",
        "name": "Hemograma"
      }
    ]
  }
]
例如,我希望检索所有名称类似于“字符串”的过程,在我的clinics集合的所有文档中进行搜索

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

任何帮助都会很好

编辑

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

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

这将返回给我给定诊所中的所有过程(过程是诊所中的一个数组),而不仅仅是字段名为“LIKE”我的搜索字符串的过程。如何实现这一点?

ArangoDB以与SQL类似的方式进行匹配。但是,您必须对要在上执行的字段进行寻址: (必须有一个对象作为toplevel,并带有强制属性_key等)


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

您可以将诊所存储在
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
属性,添加一个新属性
procedures
,并将匹配的procedures对象作为值。问题是,如果
LIKE()
找到多个过程,则会返回多个结果。您可以
限制为
过滤器
下方的
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}
    )

我的查询是这样的,但是您给我的语句返回了一个错误。“过程”是我的文档(诊所)的一个数组字段,里面有对象,这些对象有一些字段,其中哪一个是我要查询的字符串字段。
FOR clinic IN clinics
    FOR proc IN clinic.procedures
        FILTER LIKE(proc.name, "%hemo%", true)
        RETURN MERGE(
            UNSET(clinic, "procedures"),
            {procedure: proc}
        )
FOR clinic IN clinics
    LET p = (
        FOR proc IN clinic.procedures
            FILTER LIKE(proc.name, "%hemo%", true)
            RETURN proc
    )

    RETURN MERGE(
        clinic,
        {procedures: p}
    )