Форматирование даты с помощью Marklogic Optic API - PullRequest
0 голосов
/ 29 апреля 2019

Мой вопрос заключается в том, чтобы заставить API консоли запросов MarkLogic форматировать столбец строк в даты.

Работа со строкой напрямую работает как положено:

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]"))

Возвращает следующую ошибку:

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

Я полагаю, что это отличается от других вопросов по этой теме, поскольку, насколько я могу судить, они не касались OPTIC API и были решены путем работы только с одиночными строками. Как преобразовать строку в дату введите MarkLogic? Мне нужно взять оптический «столбец» и преобразовать его тип в объект даты, чтобы я мог вызвать https://docs.marklogic.com/xdmp.monthNameFromDate и другие связанные с ним инструменты.

Мне не хватает чего-то очень простого в применении функций к наборам строк и выборе определенных столбцов.

Естественно, я хочу применить функцию к каждому свойству результирующего набора строк:

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

или что угодно. Это в основном то, что я делаю на стороне клиента, но кажется неправильным просто выбрасывать так много встроенных функций javascript и делать все это в браузере, особенно когда мне нужно создавать группы по годам и месяцам из этих представлений.

Не помогает, что некоторые ссылки о работе с объектами не работают: https://docs.marklogic.com/map.keys

1 Ответ

3 голосов
/ 30 апреля 2019

Вызов 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 (), который принимает лямбду и появляется на шаге конвейера непосредственно перед вызовом result (), как описано в:

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

Запоздалая сноска: Одной из альтернатив для этого случая синтаксическому анализу и форматированию даты будет использование op.fn.translate() для преобразования значения столбца, превращая каждый экземпляр "/" в "-"

Надеясь, что помогает

...