+-
如何在MongoDB中将BinData类型3数据转换为类型4?

我意识到我的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
投票

如果驱动程序不支持它,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有以下选项:

Legacy UUID Encoding

UPDATE

使用mongo shell查找与给定UUID字符串匹配的文档的快速而又脏的方法:

var binData3 = UUID("b36148dde185428d94d935dacabfa635")
var binData4 = UUID("b36148dd-e185-428d-94d9-35dacabfa635")