marklogic - 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?
解决方案
我使用 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
谢谢您的帮助!
推荐阅读
- python - 小数中的小整数错误,两个参数都应该是 Rational 实例
- list - 有没有办法在循环之外初始化一个列表,它是否被删除并在飞镖中重用?
- linux - 如何解决错误“do_package: ... not shipping in any package”?
- php - REAL HOMES THEME 问题 array_filter, bool given
- php - 使用密码作为参数保护 PHP
- r - 如何在多次出现的模式上剪切子字符串?
- cakephp - 无法保存关联 (hasOne) 数据
- html - 如果背景图像放在另一个标签中,CSS mix-blend-mode 不起作用
- hive - hive 脚本由于堆空间问题而失败,无法处理太多分区
- sql - 同一个对象上带有键锁(UPDLOCK、ROWLOCK、HOLDLOCK)的 SQL 死锁