当前位置: 首页 > 知识库问答 >
问题:

MarkLogic中有没有一种方法可以通过REST API查询视图,而无需在中间层编写代码?

薛寒
2023-03-14

我在MarkLogic中有多个文档,都属于同一个集合。我创建了一个模板,以便创建一个视图,并且可以通过该视图查询文档记录。但是,MarkLogic仅支持通过SQL或OpticAPI查询视图。我想通过REST API查询视图。这怎么可能呢?

假设我的文档位于路径/employee//UUID.json上。

以下是一个文档的创建方式及其包含的数据

declareUpdate();
xdmp.documentInsert("/employee/1586502/981723ioewqhdijsaduih3q8yeuiqwhdeqw.json",
{
      "EmployeeID": "1234567",
      "EmployeeName": "Lorem Ipsum",
      "JoiningDate": "2018-07-01"
    },
xdmp.defaultPermissions(),
[
  "EmployeeRecordCollection"
])

以下是模板定义:

'use strict'
var tde = require("/MarkLogic/tde.xqy");
var EmployeeRecordTDE = xdmp.toJSON(
  {
    "template": {
      "context": "/",
      "collections": ["EmployeeRecordCollection"],
      "rows": [
        {
          "schemaName": "employees",
          "viewName": "EmployeeRecordView",
          "columns": [
            {
              "name": "employeeId",
              "scalarType": "string",
              "val": "EmployeeID"
            },
            {
              "name": "rateType",
              "scalarType": "string",
              "val": "EmployeeName",
            },
            {
              "name": "startDate",
              "scalarType": "string",
              "val": "JoiningDate"
            }
          ]
        }
      ]
    }
  }
);
tde.validate( 
  [EmployeeRecordTDE]
);

tde.nodeDataExtract( 
  [fn.collection(["EmployeeRecordCollection"])],
  [EmployeeRecordTDE]
);

tde.templateInsert(
  "/employee/EmployeeRecordTDE.json" ,
  EmployeeRecordTDE,
  xdmp.defaultPermissions(),
  ["EmployeeRecordCollection"]
)

上述模板创建了一个名为“EmployeeRecordView”的视图,可以使用SQL查询该视图:

select * from EmployeeRecordView where...;

可以使用Javascript中的OpticAPI将其转换为计划:

declareUpdate();
const op = require('/MarkLogic/optic');

const EmployeePlanSQL =
   op.fromSQL("select * from EmployeeRecordView")
const planObj = EmployeePlanSQL.export();

xdmp.documentInsert("emplRatePlanSQL.json", planObj);

op.import(cts.doc('emplRatePlanSQL.json').toObject())
  .result();

我想我可以使用这个计划在MarkLogic中公开一个REST API,这样我就不会在应用程序代码中保留查询。MarkLogic确实提供了一种方法,但是整个计划定义必须在REST API中作为查询传递,这也是不需要的。

http://localhost:8040/v1/rows?plan=...

此外,最大的愿望不是将查询保留在应用程序代码中。有没有办法通过MarkLogic中的JS函数或其他方法将此计划公开为RESTAPI?

共有2个答案

巴帅
2023-03-14

我使用REST API扩展来实现这一点,因为我想避免中间层。

这是我点击的URL

http://localhost:8040/LATEST/config/resources/employees?version=1.0&provider=yourTeam&method=get

使用HTTP标头:

Content-Type: application/vnd.marklogic-javascript

具有以下主体:

function get(context, params) {
  context.outputStatus = [201, 'Yay'];
  const op = require('/MarkLogic/optic');
  return op.import(cts.doc('emplRatePlanSQL.json').toObject()).result();
}

// Include an export for each method supported by your extension.
exports.GET = get;

然而,输出没有格式化为JSON记录数组。这使我完全避免了中间层,并节省了大量Java代码。

现在,我只需调用此URI(HTTP GET)即可调用此计划:

http://localhost:8040/LATEST/resources/employees

谢谢你的帮助!

靳高明
2023-03-14

在前面的回答中,我没有意识到目标是封装查询并只传递条件。

如果中间层是用Java编写的,一种方法是定义一个数据服务,该服务采用计划的标准并在endpoint内封装查询:

http://docs.marklogic.com/guide/java/DataServices

否则,您可以使用封装查询的资源服务扩展:

http://docs.marklogic.com/guide/rest-dev/extensions#id_59188

Java API和节点。JSAPI提供了到资源服务扩展的接口。它们也可以在Rest时调用:

http://docs.marklogic.com/REST/client/service-extension

希望这更有用,

 类似资料:
  • 我正在用SpringBoot构建一个应用程序。我有一个存储库,我通过以下方式从方法名称创建查询: 这样的查询可以工作,方法调用的结果是具有该名称的用户。在Spring Boot中是否可以按名称创建查询,其中输入是名称列表,输出是用户列表,其中每个用户至少对应于列表中的一个名称?例如: 我也试过这样的方法,但是行不通。

  • 问题内容: 我有一个这样的html代码段: html中此元素的唯一唯一标识是attribute ,因此我想使用 某种 Pythonselenium 方法 来定位它,如下所示: 我已经检查了selenium(python)文档以查找元素, 但是没有获得关于如何通过attr 定位此elem的线索。有没有在pythonselenium中找到该元素的明确方法? 问题答案: 您可以 通过xpath 获取它并

  • 问题内容: 有没有办法绕过python中的类的构造函数? 例: 现在,我想创建一个实例。看起来可能像这样,但是这种语法不正确。 编辑: 一个更复杂的示例: 假设我有一个对象,目的是存储一个参数并对其进行一些计算。但是,该参数并未按原样传递,而是被嵌入到巨大的参数文件中。它可能看起来像这样: 现在,我想转储并加载该对象的实例。但是,在加载该对象时,我只有一个变量,并且无法调用构造函数,因为它需要参数

  • 问题内容: 我正在使用GhostDriver的Java绑定对PhantomJS运行Selenium接受测试。 如果PhantomJS请求的网页之一通过console.log登录到Javascript控制台,是否可以捕获或查看这些消息? 我想这的答案很简单,但我无法解决! 问题答案:

  • 问题内容: 现在我正在做: 有没有更有效的方法直接从Find(或其他搜索功能)中获取带有用户名的slice,而没有struct和range循环? 问题答案: MongoDB的结果始终是文档列表。因此,如果要获取值列表,则必须像以前一样手动将其转换。 使用自定义类型(源自) 另外请注意,如果您要创建自己的类型(从派生),则可以覆盖其取消编组逻辑,并仅从文档中“提取” 。 它看起来像这样: 然后将用户

  • 我想在PHP中使用Elastic来处理来自我网站的搜索请求。例如,我有搜索参数 但是不应该总是搜索所有参数。 所以可能只有(< code >姓名和< code >年龄)有值,而(< code >身高和< code >体重)没有值。 有没有办法构建一个具有灵活/不断变化的输入值的查询? 当没有(和)的搜索值时,下面的查询将不起作用。