- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
正在将 MongoDB 迁移到 postgres。
感谢 postgres JSON ,这使得将嵌套文档作为 JSON 移动变得容易。但问题始于迁移“ID”字段。
Mongo 生成一个大的十六进制数 56c4100560b2d8308f4bde21
我尝试将其转换为 BigInt,不幸的是它超出了范围 26397231623443762880753094891
ID 无法重新生成,因为它在各处的文档之间相互链接。
字符串不能用作 ID 字段,因为我正在迁移到 Postgres + JPA,并且我将使用自动生成序列。
有什么办法,我可以将这个十六进制缩短为更短版本的 Int 或 BigInt ,同时我应该保持唯一性
我尝试取模,但它带来了重复
最佳答案
您最好的选择是迁移 MongoDB 的 ObjectId
字段到 PostgreSQL 的 uuid
列。请注意,UUID 中有更多字节,因此您需要填充这些值。
查看更多信息:
如果你真的想用bigint
s,你有两个选择:
<强>1。创造全新的值(value)
text
/varchar
为你的ObjectId
值(value)观(目前)ON UPDATE CASCADE
对于所有 ObjectId
专栏。ObjectId
的表专栏。更新 ObjectId
列(虽然它们仍然是 text
/varchar
),其中:
UPDATE table_name
SET object_id_col = nextval('table_name_object_id_col_seq')::text
(这会将更改传播到引用表,因为外键是较早设置的。)
ObjectId
的列类型列到 bigint
OWNED BY
表格列nextval('table_name_object_id_col_seq')
作为默认值此方法保证在迁移过程中永远不会出现重复值。该序列可用于为主键创建新值。
<强>2。以某种方式使用您的原始值
截断会导致信息丢失,因此无论您尝试什么方法,您可能都会得到重复的值。但是,您可以使用 f.ex 来减少这种情况的发生。按位XOR
(通常是 PostgreSQL 中的 #
运算符)而不是模数。
有了这个函数 f.ex。您可以将原始值用作:
0
(或与其他人一起,固定起始值)<the_previous_result> # <value_from_2.>
这是一个执行此操作的 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. 来自序列)将始终为正值。
关于mongodb - Mongo 到 Postgres 迁移 - 将 mongo hexa Id 字段转换为更短的整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43039653/
出现在 python 2.7.8 中。 3.4.1 不会发生这种情况。 示例: >>> id(id) 140117478913736 >>> id(id) 140117478913736 >>> id
好吧,我对动态创建的控件的 ID 很困惑。 Public Class TestClass Inherits Panel Implements INamingContainer
我收到下面的错误,说有堆栈溢出。发生这种情况是因为带有 IN (id, id, id...id) 的 SQL 语句有大量参数。有没有什么办法解决这一问题?这是在我使用 Eclipse 的本地环境中发生
为什么 CPython(不知道其他 Python 实现)有以下行为? tuple1 = () tuple2 = ()
为什么 CPython(对其他 Python 实现一无所知)有以下行为? tuple1 = () tuple2 = ()
非常简单的问题:当我有一个持久对象时,它通常有一个名为 ID 的属性(对于抽象类)。 那么..命名约定是ID还是Id? 例如。 public int ID { get; set; } 或 public
知道为什么我会收到此错误,我已经尝试了所有命名约定(小写/大写) 我正在使用 Vaadin,这是我的代码片段: public class Usercontainer extends BeanI
为什么 CPython(不知道其他 Python 实现)有以下行为? tuple1 = () tuple2 = ()
我需要改变表的所有主键 UPDATE TODO SET id = id + 1 但我做不到(Demo 来自 Ahmad Al-Mutawa 的回答)描述了原因。主键不能这样改。 我也不能根据这是 sq
我正在尝试列出与用户相关的讨论列表。 想象一下,如果你愿意的话: posts -------------------------------------------------------------
我有一个表,其中包含一些具有自己的 ID 和共享 SKU key 的文章。我尝试使用左连接进行查询,并使用组结果获取从查询返回的所有 id。 我的数据结构是这样的: id - name -
在下表People中: id name 1 James 2 Yun 3 Ethan 如果我想找到最大 ID,我可以运行此查询 select max(id) id from People; 结果是
我正在产品页面上创建评论模块,其中显示垃圾评论选项,并显示 onclick 显示和隐藏弹出窗口。现在它在单个评论中工作正常但是当评论是两个时它同时打开两个因为类是相同的。现在这就是为什么我想要获取父
根据 REST 哲学,PUT操作应该(取自维基百科): PUT http://example.com/resources/142 Update the address member of the co
我想知道如何在使用 PHP 或 JavaScript 进行身份验证后从 Google Analytics 获取 Property Id、View Id 和 Account Id?因为我希望能够将它们存
我想使用所选按钮的 ID 进行删除。但我不知道如何从中获取/获取 id。我尝试了 this.id 但不起作用。 这是我创建按钮的地方: var deleteEmployer= document.cre
我有一个具有以下结构的表“表” ID LinkedWith 12 13 13 12 14 13 15 14 16
请不要在未阅读问题的情况下将问题标记为重复。我确实发布了一个类似的问题,但 STACKOVERFLOW 社区成员要求我单独重新发布修改后的问题,因为考虑到一个小而微妙的修改,解决方案要复杂得多。 假设
在 Android Studio 中,我创建了一个 Person.java 类。我使用Generate 创建了getter 和setter 以及构造函数。 这是我的 Person.java 类: pu
如何在 jQuery 中制作这样的东西: //这是显示的主体 ID //当我悬停 #hover-id 时,我希望 #principal-id 消失并更改 。但是当我将光标放在 #this-id 上时
我是一名优秀的程序员,十分优秀!