我想在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
}
这将返回给定诊所中的所有程序(程序是诊所内的一个数组),而不仅仅是字段名称“喜欢”我的搜索字符串的程序。我怎样才能做到这一点?
答案 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()
找到多个程序,将返回多个结果。您可以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}
)
属性简化为匹配过程,则需要子查询:
@interface ViewController ()
@property (nonatomic, strong) NSMutableArray *myArray;
@end