我正在开发一个节点微服务,orm和b分别是typeorm
and postgresql
我正在尝试创建jsonb
数组列,但我可能没有以正确的方式进行操作。
Notes
- 我通常会通过简单地添加一个简单的额外实体和关系来完成此任务。在这种情况下,我被要求使用
jsonb
类型以便能够修改界面而不适应架构更改。
- 目前,存储一个简单的索引 ID 列表也同样足够了。
- 我不确定我应该使用
array: true
列选项。我尝试使用普通的jsonb
对象没有成功("{}"::jsonb
).
My aim:
存储对象数组indexed id
列,并能够添加和删除 id。如果这是不可能的,可以使用平面索引字符串数组。
e.g:
[ {id: 'some-uuid-000'}, {id: 'some-uuid-001'}, ... ]
or:
['some-uuid-000', 'some-uuid-001', 'some-uuid-002']
Code:
我的列定义:
@Column({
type: 'jsonb',
array: true,
default: () => 'ARRAY[]::jsonb[]',
nullable: false,
})
public users: Array<{ id: string }> = [];
我设法获取空数组
const group = await repo.findOneOrFail({ id: groupId });
console.log('>>>>>', group.users);
其输出:
>>>>> []
当尝试将项目添加到数组并保持如下时
return repo.update(groupId, { users: [...group.users, { id: userId }] });
我得到以下输出:
2019-12-21 14:40:44.088 UTC [556] ERROR: malformed array literal: "[{"id":"cc135b8a-b6ed-4cd7-99fc-396228e74509"}]"
2019-12-21 14:40:44.088 UTC [556] DETAIL: "[" must introduce explicitly-specified array dimensions.
2019-12-21 14:40:44.088 UTC [556] STATEMENT: UPDATE "group" SET "users" = $2, "created_at" = CURRENT_TIMESTAMP WHERE "id" IN ($1)
(node:5050) UnhandledPromiseRejectionWarning: QueryFailedError: malformed array literal: "[{"id":"cc135b8a-b6ed-4cd7-99fc-396228e74509"}]"
输出错误告诉我配置一定是错误的,因为 postgres 似乎提供了一个普通对象数组,同时期望不同的格式/符号。我在文档中没有找到有关此类场景的更多详细信息。