ARANGODB AQL MATCHES()不可能具有嵌套对象

jm2pwxwz  于 2022-12-09  发布在  Go
关注(0)|答案(1)|浏览(86)

我使用MATCHES() AQL函数在arango数据库中搜索与某个示例匹配的条目。这个特性对于普通的示例很好用,但是对于嵌套的特性我就不能让它正常工作了。参见示例:

RETURN MATCHES(
{ "a" : { "c" : 1 }, "b" : 1 },
{ "a" : { "c" : 1 } },
false
)

这将返回true,但是如果我尝试:

RETURN MATCHES(
{ "a" : { "c" : 1, "b" : 1 }},
{ "a" : { "c" : 1 } },
false
)

它返回**false**!!(我期望返回true)
我已经在www.example.com的Query by example部分了解到这一点https://www.arangodb.com/docs/stable/data-modeling-documents-document-methods.html#query-by-example
他们的解决方案是使用点标记法,但它在AQL中不起作用
以他们为榜样:

RETURN MATCHES(
{ "a" : { "c" : 1, "b" : 1 } },
{ "a.c" : 1 },
false
)

返回false(我希望返回true)
那么,如何将MATCHES()用于嵌套属性呢?
仅供参考:我使用arangodb v3.5.5-1
说明:我想通过给出{ "a" : { "c" : 1 } }作为示例来获得{ "a" : { "c" : 1, "b" : 1 } }的匹配
我已经在ArangoDB存储库中发布了该问题:https://github.com/arangodb/arangodb/issues/12541

u2nhd7ah

u2nhd7ah1#

MATCHES比较属性--它不关心属性的类型,所以如果要匹配嵌套对象,它们必须具有相同的属性/值;因此,你不能有任意深的结构重叠和检查对应关系。
在给出的示例中,您可以挑选出具有LET的子结构,并针对该子结构使用MATCHES

LET doc = { "a" : { "c" : 1, "b" : 1 }}
LET a = doc.a

RETURN MATCHES(
  a,
  { "c": 1}
)

要利用arangojs功能使用路径窥视结构,可以编写一个使用按示例查询的用户函数,并从AQL(https://www.arangodb.com/docs/stable/aql/extending.html)调用该函数。
注意:您的语言的arangodb客户端库应该提供对注册用户函数的方便访问(例如arangodb-php中的class AqlUserFunctions)。

相关问题