javascript - 使用 Marklogic Optic API 进行日期格式化

标签 javascript date marklogic

我的问题是如何让 MarkLogic 查询控制台 javascript API 将一列字符串格式化为日期。

直接处理字符串可以按预期工作:

var d = new Date("3/12/2019");
xdmp.monthNameFromDate(xs.date(d))
>>> March

但是使用 optic 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]"))

返回以下错误:

[javascript] XDMP-CAST: function bound ()() -- Invalid cast: {_expr:"¿\"completed date\"", _preplans:null, _schemaName:null, ...} cast as xs.date

我相信这与该主题的其他问题不同,因为据我所知,这些问题不涉及 OPTIC API,并且仅通过对单个字符串进行操作即可解决。 How to convert string to date type in MarkLogic? 我需要获取一个光学“列”并将其类型转换为日期对象,以便我可以调用 https://docs.marklogic.com/xdmp.monthNameFromDate以及其他相关工具。

我觉得缺少一些关于将函数应用于行集和选择特定列的非常简单的东西。

我自然想要做的是将函数应用于结果行集的每个属性:

let formatted = resulting_rows.map(x=>Date(x['completed date'])

或者其他什么。这基本上就是我在客户端所做的事情,但是抛弃这么多内置的 javascript 功能并在浏览器中完成这一切感觉是不正确的,特别是当我需要从这些 View 中对年份和月份进行分组时。

一些有关对象操作的链接已损坏,这并没有帮助: 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() 执行查询管道。

map 是相当于 JavaScript 文字的 XQuery,但未在服务器端 JavaScript 中使用。 Optic 确实支持 map() 管道步骤,该步骤采用 lambda 并出现在调用 result() 之前的管道步骤中,如下所示:

http://docs.marklogic.com/AccessPlan.prototype.map

迟来的脚注:这种情况下解析和格式化日期的一种替代方法是使用 op.fn.translate() 通过将每个将“/”实例替换为“-”

希望有帮助,

关于javascript - 使用 Marklogic Optic API 进行日期格式化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55909263/

相关文章:

带时区的 Java 日期 validator

xml - Xquery 从 XSD 架构中获取属性名称和类型?

xquery - MarkLogic 8 - 使用文档管理和结帐的 XQuery

javascript - Protractor 和 promise

javascript - 使用 md5.js 的客户端密码加密和 PHP 解密

javascript - 创建一个新的 Date 对象或使用 javascript Date() 的 setter 方法

angular - 日期管道错误-升级到 Angular 11 时无法读取未定义的属性 'toLowerCase'

gradle - 如何使用Gradle配置MarkLogic数据库备份?

javascript - 如何阻止页面刷新以及尝试获取文本字段内的值时哪里出错了?

javascript - webpack 模板中的 Vuejs 延迟加载路由