我在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?
我使用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
谢谢你的帮助!
在前面的回答中,我没有意识到目标是封装查询并只传递条件。
如果中间层是用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 >体重)没有值。 有没有办法构建一个具有灵活/不断变化的输入值的查询? 当没有(和)的搜索值时,下面的查询将不起作用。