我意识到我的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
?
如果驱动程序不支持它,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有以下选项:
UPDATE
使用mongo shell查找与给定UUID字符串匹配的文档的快速而又脏的方法:
var binData3 = UUID("b36148dde185428d94d935dacabfa635")
var binData4 = UUID("b36148dd-e185-428d-94d9-35dacabfa635")