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

时间:2019-03-11 10:46:06

标签: mongodb

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

1 个答案:

答案 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具有以下选项:

Legacy UUID Encoding

更新

一种使用mongo shell查找与给定UUID字符串匹配的文档的快捷方法:

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