使用 Marklogic Optic 进行日期格式化 API
Date Formatting with Marklogic Optic API
我的问题是关于让 MarkLogic 查询控制台 javascript API 将一列字符串格式化为日期。
直接处理字符串如预期工作:
var d = new Date("3/12/2019");
xdmp.monthNameFromDate(xs.date(d))
>>> March
使用光学元件 api 但是:
const op = require('/MarkLogic/optic');
const ind = op.fromView('schema', 'money');
//get non null dates, stored as strings, [MM-DD-YYYY]
const ind2 = ind.where(op.ne(op.col('completed date'), ""))
const testMonth = op.as('testDate', fn.formatDate(xs.date(op.col('completed date')), "[M01]-[D01]-[Y0001]"))
Returns 出现以下错误:
[javascript] XDMP-CAST: function bound ()() -- Invalid cast: {_expr:"¿\"completed date\"", _preplans:null, _schemaName:null, ...} cast as xs.date
我认为这与关于该主题的其他问题不同,因为据我所知,这些问题不涉及 OPTIC API,并且仅通过对单个字符串进行操作就解决了。
我需要一个光学 "column" 并将其类型转换为日期对象,以便我可以在其上调用 https://docs.marklogic.com/xdmp.monthNameFromDate 和其他相关工具。
关于将函数应用于行集和选择特定列,我觉得缺少一些非常简单的东西。
我自然想做的是对结果行集的每个 属性 应用一个函数:
let formatted = resulting_rows.map(x=>Date(x['completed date'])
或其他。这基本上就是我在客户端所做的事情,但是放弃这么多内置的 javascript 功能并在浏览器中完成这一切感觉是不正确的,特别是当我需要在几年和几个月内进行分组时这些观点。
一些关于对象操作的链接被破坏也无济于事:
https://docs.marklogic.com/map.keys
op.as() 调用根据执行查询时应用于每一行的表达式定义动态列。
表达式只能调用 Optic 提供的函数 API。特别是,xs.date() 在调用时执行,op.xs.date() 在处理每一行时执行。类似地,fn.formatDate() 立即执行,而 op.fn.formatDate() 在行处理期间执行。
要使用动态列,请将其作为参数提供给 op.select(),类似于以下草图:
op.fromView('schema', 'money');
.where(op.ne(op.col('completed date'), ""))
.select([
op.col('completed date'),
op.as('testDate', op.fn.formatDate(
xdmp.parseDateTime(
op.col('completed date'),
"[M01]/[D01]/[Y0001]"),
"[M01]-[D01]-[Y0001]"))
])
.result();
调用 .result() 执行查询管道。
该映射是 XQuery 等同于 JavaScript 未在服务器端 JavaScript 中使用的文字。 Optic 确实支持 map() 管道步骤,它采用 lambda 并在调用 result() 之前立即出现在管道步骤中,如以下文档所述:
http://docs.marklogic.com/AccessPlan.prototype.map
迟来的脚注: 在这种情况下,解析和格式化日期的另一种方法是使用 op.fn.translate()
通过转换“/”的每个实例来转换列值" 变成 "-"
希望对您有所帮助,
我的问题是关于让 MarkLogic 查询控制台 javascript API 将一列字符串格式化为日期。
直接处理字符串如预期工作:
var d = new Date("3/12/2019");
xdmp.monthNameFromDate(xs.date(d))
>>> March
使用光学元件 api 但是:
const op = require('/MarkLogic/optic');
const ind = op.fromView('schema', 'money');
//get non null dates, stored as strings, [MM-DD-YYYY]
const ind2 = ind.where(op.ne(op.col('completed date'), ""))
const testMonth = op.as('testDate', fn.formatDate(xs.date(op.col('completed date')), "[M01]-[D01]-[Y0001]"))
Returns 出现以下错误:
[javascript] XDMP-CAST: function bound ()() -- Invalid cast: {_expr:"¿\"completed date\"", _preplans:null, _schemaName:null, ...} cast as xs.date
我认为这与关于该主题的其他问题不同,因为据我所知,这些问题不涉及 OPTIC API,并且仅通过对单个字符串进行操作就解决了。
关于将函数应用于行集和选择特定列,我觉得缺少一些非常简单的东西。
我自然想做的是对结果行集的每个 属性 应用一个函数:
let formatted = resulting_rows.map(x=>Date(x['completed date'])
或其他。这基本上就是我在客户端所做的事情,但是放弃这么多内置的 javascript 功能并在浏览器中完成这一切感觉是不正确的,特别是当我需要在几年和几个月内进行分组时这些观点。
一些关于对象操作的链接被破坏也无济于事: https://docs.marklogic.com/map.keys
op.as() 调用根据执行查询时应用于每一行的表达式定义动态列。
表达式只能调用 Optic 提供的函数 API。特别是,xs.date() 在调用时执行,op.xs.date() 在处理每一行时执行。类似地,fn.formatDate() 立即执行,而 op.fn.formatDate() 在行处理期间执行。
要使用动态列,请将其作为参数提供给 op.select(),类似于以下草图:
op.fromView('schema', 'money');
.where(op.ne(op.col('completed date'), ""))
.select([
op.col('completed date'),
op.as('testDate', op.fn.formatDate(
xdmp.parseDateTime(
op.col('completed date'),
"[M01]/[D01]/[Y0001]"),
"[M01]-[D01]-[Y0001]"))
])
.result();
调用 .result() 执行查询管道。
该映射是 XQuery 等同于 JavaScript 未在服务器端 JavaScript 中使用的文字。 Optic 确实支持 map() 管道步骤,它采用 lambda 并在调用 result() 之前立即出现在管道步骤中,如以下文档所述:
http://docs.marklogic.com/AccessPlan.prototype.map
迟来的脚注: 在这种情况下,解析和格式化日期的另一种方法是使用 op.fn.translate()
通过转换“/”的每个实例来转换列值" 变成 "-"
希望对您有所帮助,