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

如何在MongoDB中将BinData类型3数据转换为类型4?,mongodb,Mongodb,我意识到我的MongoDB后端将UUID数据存储为BinDatatype3,我发现很难手动跟踪或查询文档,因为通过我的应用程序编码的UUID似乎与我在数据库中看到的不同。我可能需要考虑将所有这些迁移到类型4,但是我不确定如何。 例如,UUIDb36148dd-e185-428d-94d9-35dacabfa635通常在base64中编码为s2FI3eGFQo2U2TXayr+mNQ==。但是,它在我的MongoDB中表示为BinData类型为3的jUKF4d1IYbM1pr/K2jXZlA=(B

我意识到我的MongoDB后端将UUID数据存储为
BinData
type3,我发现很难手动跟踪或查询文档,因为通过我的应用程序编码的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,“jukf4d1ybm1pr/K2jXZlA==”
不同。然而,根据我的测试,
BinData(4,“s2FI3eGFQo2U2TXayr+mNQ==”)
(注意类型4)似乎转换为与
BinData(3,“jukf4d1ybm1pr/K2jXZlA==”)相同的UUID。如果我有一个
BinData
type3对象,如何正确地转换为type4?另一个问题是,如果我有一个UUID字符串,如何正确初始化类型3
BinData

如果驱动程序不支持它,有一个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);
}

如果驱动程序不支持,有一个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);
}

谢谢你。然而,目前,我想知道是否有一种快速而肮脏的方法可以在Mongo(shell)的上下文中实现这一点。如果只给我一个UUID字符串,有没有一种方法可以让我搜索与之匹配的文档而不必求助于我的应用程序代码?谢谢,但不幸的是,它对类型4不起作用。Mongo shell抱怨输入字符超过32个。谢谢。然而,目前,我想知道是否有一种快速而肮脏的方法可以在Mongo(shell)的上下文中实现这一点。如果只给我一个UUID字符串,有没有一种方法可以让我搜索与之匹配的文档而不必求助于我的应用程序代码?谢谢,但不幸的是,它对类型4不起作用。MongoShell抱怨输入字符超过32个。