我意识到我的MongoDB后端将UUID数据存储为BinData
类型3,并且发现手动跟踪或查询文档非常困难,因为通过我的应用程序编码的UUID似乎与我在应用程序中看到的有所不同。数据库。我可能不得不考虑将所有这些都迁移到类型4,但是我不确定如何迁移。
例如,UUID b36148dd-e185-428d-94d9-35dacabfa635
通常以base64编码为s2FI3eGFQo2U2TXayr+mNQ==
。但是,在我的MongoDB中,它以Bindata类型3(jUKF4d1IYbM1pr/K2jXZlA==
)表示为BinData(3, "jUKF4d1IYbM1pr/K2jXZlA==")
。
我尝试根据上面的给定UUID字符串创建UUID:
> var uuid = UUID("b36148dde185428d94d935dacabfa635")
> uuid
BinData(3,"s2FI3eGFQo2U2TXayr+mNQ==")
因此,如果我正确理解BinData(3, "s2FI3eGFQo2U2TXayr+mNQ==")
与BinData(3, "jUKF4d1IYbM1pr/K2jXZlA==")
是不同的。但是,根据我的测试,BinData(4, "s2FI3eGFQo2U2TXayr+mNQ==")
(请注意类型4)似乎转换为与BinData(3, "jUKF4d1IYbM1pr/K2jXZlA==")
相同的UUID。如果我有一个BinData
3类对象,如何正确转换为4类?另一个问题是,如果我有UUID字符串,如何正确初始化类型3 BinData
?
答案 0 :(得分:0)
如果驱动程序不支持,https://studio3t.com/knowledge-base/articles/mongodb-best-practices-uuid-data/#mongodb-best-practices有一个Java示例,可以轻松地将其转换为目标语言:
/**
* Convert a UUID object to a Binary with a subtype 0x04
*/
public static Binary toStandardBinaryUUID(java.util.UUID uuid) {
long msb = uuid.getMostSignificantBits();
long lsb = uuid.getLeastSignificantBits();
byte[] uuidBytes = new byte[16];
for (int i = 15; i >= 8; i--) {
uuidBytes[i] = (byte) (lsb & 0xFFL);
lsb >>= 8;
}
for (int i = 7; i >= 0; i--) {
uuidBytes[i] = (byte) (msb & 0xFFL);
msb >>= 8;
}
return new Binary((byte) 0x04, uuidBytes);
}
/**
* Convert a Binary with a subtype 0x04 to a UUID object
* Please note: the subtype is not being checked.
*/
public static UUID fromStandardBinaryUUID(Binary binary) {
long msb = 0;
long lsb = 0;
byte[] uuidBytes = binary.getData();
for (int i = 8; i < 16; i++) {
lsb <<= 8;
lsb |= uuidBytes[i] & 0xFFL;
}
for (int i = 0; i < 8; i++) {
msb <<= 8;
msb |= uuidBytes[i] & 0xFFL;
}
return new UUID(msb, lsb);
}
类型3在字节顺序上与类型4基本不同。
它是内部数据存储格式,因此足以改变您浏览数据的方式。 Robo 3T具有以下选项:
更新
一种使用mongo shell查找与给定UUID字符串匹配的文档的快捷方法:
var binData3 = UUID("b36148dde185428d94d935dacabfa635")
var binData4 = UUID("b36148dd-e185-428d-94d9-35dacabfa635")