javascript - 在 MarkLogic 中使用 REST API 搜索调用仅提取部分 JSON 文档

标签 javascript search xquery marklogic

我正在寻找使用 JavaScript 或 XQuery 在 MarkLogic 中使用 REST API 搜索调用仅提取部分 JSON 文档的方法。 我尝试使用 re extract-document-data 的查询选项但没有成功。尝试使用 CTS.validextract 路径检查我的提取路径,但 Marklogic 9.0-1 无法识别该功能

我是否必须使用特定的搜索选项,如约束或结构化查询。 你能帮忙吗? TIA。

我有下面这样的示例文档

{
"GenreType": {
    "Name": "GenreType",
    "LongName": "Genre Complex",
    "AttributeDataType": "String",
    "GenreType Instance Record": [
      {
        "Name": "GenreType Instance Record",
        "Action": "NoChange",
        "TitleGenre": [
          "Test1"
        ],
        "GenreL": [
         "Test1"
        ],
        "GenreSource": [
          "ABC"
        ],
        "GenreT": [
          "Test1"
        ]
      },
      {
        "Name": "GenreType Instance Record",
        "Action": "NoChange",
        "TitleGenre": [
          "Test2"
        ],
        "GenreL": [
          "Test2"
        ],
        "GenreSource": [
          "PQR"
        ],
        "GenreT": [
          "Test2"
        ]
      }
     ]

    }
}   

我需要在其中搜索 GenreType 复杂属性中具有属性“TitleGenre”WHERE GenreSource =“ABC”的文档。它是 json 文档中的一个数组。

我正在使用如下搜索选项,(在 XML 中编写搜索选项,但在 json 文档中搜索)

  <extract-path>/GenreType/"GenreType Instance Record"[@GenreSource="ABC"]</extract-path>

我仍然面临这些问题。如果可能的话,您能否告诉我如何搜索 json 文档来满足此类特定要求? @瓦格纳迈克尔

最佳答案

您可以使用 extract-document-data 提取文档数据option .

xquery version "1.0-ml";
let $doc := object-node {
"GenreType": object-node {
    "Name": "GenreType",
    "LongName": "Genre Complex",
    "AttributeDataType": "String",
    "GenreType-Instance-Record": array-node {
      object-node {
        "TitleGenre": array-node {
          "Test1"
        },
        "GenreSource": array-node {
          "ABC"
        }
      },
      object-node {
        "TitleGenre": array-node {
          "Test2"
        },
        "GenreSource": array-node {
          "PQR"
        }
      }}
    }
}   
return xdmp:document-insert("test.xml", $doc);

import module namespace search = "http://marklogic.com/appservices/search"
    at "/MarkLogic/appservices/search/search.xqy";

search:search(
  "Genre Complex",
  <options xmlns="http://marklogic.com/appservices/search">
    <extract-document-data>
      <extract-path>/GenreType/GenreType-Instance-Record[GenreSource = "ABC"]</extract-path>
    </extract-document-data>
  </options>
)

在这种情况下 /GenreType/GenreType-Instance-Record是提取元素的 xpath。 关于您的评论,我还添加了一个谓词 [GenreSource = "ABC"] .只有这条路GenreType-Instance-Record有一个 GenreSource正在提取“ABC”!

结果:

....
<search:extracted kind="array">[{"GenreType-Instance-Record":{"TitleGenre":["Test1"], "GenreSource":["ABC"]}}]
</search:extracted>
....

注意:

  • 您可以添加多个 <search:extract-path>元素!
  • 我不得不更改 GenreType Instance Record 的名称至 GenreType-Instance-Record .我不确定您是否可以使用带有空格的属性名称并使用 xpath 访问它们。我无法让它以这种方式工作。

如果这对您不起作用,请发布您的搜索选项。

编辑:向提取路径添加谓词。

关于javascript - 在 MarkLogic 中使用 REST API 搜索调用仅提取部分 JSON 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52309435/

相关文章:

javascript - 日期格式 - momentjs - 使用语言环境分别提取日期和时间

javascript - 在 Rails 中包含特定于页面的 JavaScript 的正确方法

javascript - 如何计算从上一期开始的 `lib.ema`?

xml - 在 XPATH 中使用多个命名空间

sql-server - 将子节点从 SQL xml 变量插入到另一个 xml 变量中

javascript - 探索 javascript 对象的属性和/或功能

python - 使用字符串列表在文件中搜索多个字符串

php、mysql搜索网站

javascript - 下划线返回数组中对象的索引,其中单词存在于对象内的句子中

SQL Server XQuery 修改