gpt4 book ai didi

mongodb - Mongo 到 Postgres 迁移 - 将 mongo hexa Id 字段转换为更短的整数

转载 作者:可可西里 更新时间:2023-11-01 09:39:09 34 4
gpt4 key购买 nike

正在将 MongoDB 迁移到 postgres。

感谢 postgres JSON ,这使得将嵌套文档作为 JSON 移动变得容易。但问题始于迁移“ID”字段。

Mongo 生成一个大的十六进制数 56c4100560b2d8308f4bde21

我尝试将其转换为 BigInt,不幸的是它超出了范围 26397231623443762880753094891

  1. ID 无法重新生成,因为它在各处的文档之间相互链接。

  2. 字符串不能用作 ID 字段,因为我正在迁移到 Postgres + JPA,并且我将使用自动生成序列。

有什么办法,我可以将这个十六进制缩短为更短版本的 Int 或 BigInt ,同时我应该保持唯一性

我尝试取模,但它带来了重复

最佳答案

您最好的选择是迁移 MongoDB 的 ObjectId字段到 PostgreSQL 的 uuid 列。请注意,UUID 中有更多字节,因此您需要填充这些值。

查看更多信息:

如果你真的想用bigint s,你有两个选择:

<强>1。创造全新的值(value)

  1. 创建您的架构(使用表、约束等)
    • 在此架构中,使用 text/varchar为你的ObjectId值(value)观(目前)
  2. 创建foreign keys对于你所有的关系,ON UPDATE CASCADE对于所有 ObjectId专栏。
  3. 创建sequences对于所有具有 ObjectId 的表专栏。
  4. 更新 ObjectId列(虽然它们仍然是 text/varchar ),其中:

    UPDATE table_name
    SET object_id_col = nextval('table_name_object_id_col_seq')::text

    (这会将更改传播到引用表,因为外键是较早设置的。)

  5. 删除外键
  6. 更改这些 ObjectId 的列类型列到 bigint
  7. 将你的序列改为OWNED BY表格列
  8. 修改表格以使用nextval('table_name_object_id_col_seq')作为默认值
  9. 重新添加外键

此方法保证在迁移过程中永远不会出现重复值。该序列可用于为主键创建新值。

<强>2。以某种方式使用您的原始值

截断会导致信息丢失,因此无论您尝试什么方法,您可能都会得到重复的值。但是,您可以使用 f.ex 来减少这种情况的发生。按位XOR (通常是 PostgreSQL 中的 # 运算符)而不是模数。

有了这个函数 f.ex。您可以将原始值用作:

  1. 开始于 0 (或与其他人一起,固定起始值)
  2. 在每次迭代中,使用输入中的 N 个最低有效位
  3. 计算结果为<the_previous_result> # <value_from_2.>
  4. 继续 2. 当有更多未使用的位时(输入应该是旧输入,但 N 最低有效位)

这是一个执行此操作的 SQL 函数:

create or replace function hex_xor(p_hex text, p_bits int default 64, p_default bigint default 0)
returns bigint
language sql
immutable
as $func$
with recursive r as (
select ('x' || p_hex)::varbit h, p_default r, 0 i
union all
select case
when bit_length(h) <= p_bits then varbit ''
else substring(h for bit_length(h) - p_bits)
end,
r # case
when bit_length(h) <= p_bits then h::bit(64)::bigint
else substring(h from bit_length(h) - p_bits + 1 for p_bits)::bigint
end,
i + 1
from r
where bit_length(h) > 0
)
select r
from r
order by i desc
limit 1
$func$;

这假设 p_hex参数实际上是十六进制格式 & p_bits参数永远不会大于 64 .

但是如果你只是按原样使用它,你可能会在稍后结束,在 INSERT 上有冲突的值.你能做的就是f.ex。使用:

select -hex_xor('56c4100560b2d8308f4bde21', 63)

迁移时。这样迁移了ObjectId s 将始终为负值 & 稍后生成的主键(f.ex. 来自序列)将始终为正值。

http://rextester.com/RCVFN77368

关于mongodb - Mongo 到 Postgres 迁移 - 将 mongo hexa Id 字段转换为更短的整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43039653/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com