Makrlogic 使用 QBE - 匹配数组项

Makrlogic using QBE - Matching Array Items

我正在尝试创建一个数组的刚好匹配,而不是使用蛮力来排除其他可能的记录:

JSON 1:

{
   "lastNames":["smith", "val", "zuul"]
}

JSON 2:

{
   "lastNames":["smith"]
}

基于前面的JSON,我只需要根据下一个QBE

检索第二个JSON
{ "$query": {"lastNames": ["smith"]} }

这是要检索2个文档,Marklogic文档也指出相同。

请检查 https://docs.marklogic.com/guide/search-dev/qbe#id_16310 - 匹配数组项

蛮力方法如下所示:

{
   "$query":{
      "$and":{
         "lastNames":[
            "smith"
         ]
      },
      "$not":{
         "lastNames":[
            "val"
         ]
      },
      "$not":{
         "lastNames":[
            "zuul"
         ]
      }
   }
}

如您所见,我们需要知道要排除的值。

是否有任何其他方法使用 QBE 或 Node 或 Java 或 XQuery 来避免使用暴力方法?

简答:QBE 无法匹配任何确切的文档结构,包括数组结构。

上下文:QBE 针对 MarkLogic 通用索引和范围索引执行。

在 JSON 个文档中,MarkLogic 通用索引包含 属性 个名称和原子值:

  • 每个对象提供一袋索引名称
  • 每个数组构成一个包含多个值的包
  • 每个原子值都有索引

与索引匹配对于性能和规模很重要。

换句话说,检查每个文档的实际结构而不是从文档投影的索引对于几乎任何生产数据库来说都是不切实际的。

一些备选方案:

  • 检查匹配的文档以消除误报(最好在 enode 上的 SJS 中)
  • 将文档中带有 _ 分隔符的数组项串联具体化为 属性 仅在查询中使用。
  • 解决TDE和Optic的问题API。

扩展最后一个备选方案:

  • TDE 可以将数组项连接为单列视图中的值。
  • 或者,TDE 可以将每个数组项投影为单独的行,查询可以对文档片段 ID 进行分组,对行进行采样,过滤掉计数 > 1 的组,然后加入文档

希望有用,