按字符串字段搜索ArangoDB

时间:2015-07-31 02:41:10

标签: json arangodb foxx

我想在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
  }

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分: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} ) 属性简化为匹配过程,则需要子查询:

@interface ViewController ()
@property (nonatomic, strong) NSMutableArray *myArray;
@end