В RavenDB 5.4+ я хочу настроить задачу SQL ETL, которая выгружает данные в базу данных PostgreSQL, используя встроенную фабрику Npgsql для Raven. У меня проблема в том, что я хочу, чтобы весь документ (this) хранился в столбце данных jsonb.
Вопрос: как я могу сохранить весь документ, например. this, в приведенном ниже примере преобразования ETL в Postgres?
Моя цель — не указывать поля/столбцы объекта Foo вручную.
Пример таблицы Postgres:
create table public.foo
(
id text,
data jsonb
);
Пример сценария преобразования ETL в RavenDB:
loadToFoo ({
id: id(this),
data: this // <-- the issue
});
Что приводит к исключению:
Npgsql.PostgresException (0x80004005): 42804: столбец «данные» имеет тип jsonb, но выражение имеет текстовый тип
Я пробовал следующие альтернативы:
data: JSON.parse(this)
Error:
System.ArgumentException: Expected string but got Symbol
---
data: JSON.stringify(this)
Error:
Npgsql.PostgresException (0x80004005): 42804: column "data" is of type jsonb but expression is of type text
Я также не уверен, связано ли это с логикой преобразования RavenDB, или решение следует рассматривать в средствах чего-то из среды выполнения Jint или в Postgres/Npgsql.
Спасибо @ShayRojansky - вот где виноват; Я не знаю, как указать или определить тип в сценарии преобразования RavenDB ETL.





Вам нужно сообщить RavenDB, какой тип вам нужен. Это делается путем прямой передачи значения и типа, например:
loadToFoo ({
id: id(this),
data: {'Value:' this, 'Type': 'Jsonb'}
});
Важной деталью является то, что для этого требуется RavenDB версии 5.4.5 или выше.
В Npgsql вы вставляете данные jsonb, давая им строку, но сообщая, что это тип jsonb (обычно путем установки NpgsqlDbType.Jsonb в вашем NpgsqlParameter). См. эти документы для получения дополнительной информации.