首页 > 解决方案 > MarkLogic 中有没有一种方法可以通过 REST API 查询视图,而无需在中间层为其编写代码?

问题描述

我在 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 函数或其他方法将此计划公开为 REST API?

标签: marklogicmarklogic-9

解决方案


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

这是我点击的网址

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

谢谢您的帮助!


推荐阅读