ArangoDB-如何通过数组元素的子字符串在集合中查找元素?

ArangoDB-如何通过数组元素的子字符串在集合中查找元素?,arangodb,aql,Arangodb,Aql,有一个具有此结构的集合: {    "user": 1,    "timestamp": 216354113151,    "message": "asddsaasddsaa",    "data": [      "name = Jack & hash = s5w464t35w145df13s5df4sdg & id = 2"      "name = Mansonack & hash = xga5fd7h68745v46ed2 & id = 18"

有一个具有此结构的集合:

{
   "user": 1, 
   "timestamp": 216354113151, 
   "message": "asddsaasddsaa", 
   "data": [
     "name = Jack & hash = s5w464t35w145df13s5df4sdg & id = 2" 
     "name = Mansonack & hash = xga5fd7h68745v46ed2 & id = 18" 
   ] 
}
我需要找到这个集合的一个元素,在key data中有一个值,该值包含一个字符串,该字符串包含子字符串xga5fd7h68745v46ed2


我可以写这个查询吗?它看起来如何?

您可以像在任何其他列表上一样循环数组项:

FOR d IN collection_name
FILTER IS_LIST(d.data)
FOR data IN d.data
FILTER CONTAINS(data, "xga5fd7h68745v46ed2")
RETURN d

如果您的数据数组有多个正在搜索的子字符串,并且只希望返回包含搜索值的唯一文档,请使用如下查询:

// what you are looking for in string
LET searchValue = 'xga5fd7h68745v46ed2'
// go through items of your collection
FOR item IN collection_name
    // store result of subquery in temporary variable
    LET wasItemFound = FIRST((
        // go through elements of your data array
        FOR str IN item.data
            // search for desired value within the element
            FILTER CONTAINS(str, searchValue)
            // we need to find only single occurance of searchValue
            LIMIT 1
            // return true if it was found
            RETURN true
    ))
    // give me only items which contained value you searched for
    FILTER wasItemFound == true
    RETURN item
如果您要查找的值对于所有数据数组元素都是唯一的,那么查询pluma建议哪个可以为您的用例执行此任务。如果在数据数组元素中搜索的子字符串多次出现,则查询将返回重复的文档。例如,考虑这个示例数据集:

[
  {
    "user": 1,
    "data": [
      "name = Jack & hash = abc & id = 2",
      "name = Mansonack & hash = abcd & id = 18"
    ]
  },
  {
    "user": 2,
    "data": [
      "name = Jack & hash = abb & id = 2",
      "name = Mansonack & hash = abc & id = 18",
      "name = xxx& hash = aaa & id = 18"
    ]
  }
]
如果使用此查询

FOR d IN collection_name
    FILTER IS_LIST(d.data)
    FOR data IN d.data
        FILTER CONTAINS(data, "ab")
        RETURN d
即使集合仅包含2个文档,它也将返回4个文档。然而,本文中的第一个查询将只返回2。说清楚一点,我并不是说普卢马的解决方案是错误的,它只是取决于你希望得到什么回报