【问题标题】:How to use .net GUID in JAVA UUID as primary key of mongodb collection如何在 JAVA UUID 中使用 .net GUID 作为 mongodb 集合的主键
【发布时间】:2017-10-11 10:11:09
【问题描述】:

我有 mongodb 数据库,其中每个集合中的每个文档都有 _id 字段,即 .net GUID。现在我们要使用来自 java 应用程序的相同数据库。如何将 GUID 转换为 UUID 并正确映射对象?

【问题讨论】:

  • guid 是如何表示的?二进制 128 位 blob 还是作为文本表示?
  • 这是我在 robomongo NUUID("d8576082-c1aa-41d5-a26e-a7c101487f1c") 中看到的内容

标签: java mongodb maven spring-boot


【解决方案1】:

Java UUID 和 Mongodb UUID 都实现了UUID standard。

文本表示可以用例如解析fromString:

UUID myUUID = UUID.fromString("449772DE-2780-4412-B9F7-E49E48605875");

要将 UUID 转换为字符串表示,请使用 toString:

String uuid = myUUID.toString(); 
// gives "449772de-2780-4412-b9f7-e49e48605875"

大写/小写无关紧要(如本例所示)。

有关如何查询文档,请参阅quickstart。

【讨论】:

  • 感谢重播!但是如何通过那个 UUID 字段对 mongodb 进行查询呢?
  • 我在下面发布了正确的答案。如果您知道另一个简单的解决方案,请告诉我。感谢您的帮助!
【解决方案2】:

我找到了解决办法。希望它会帮助别人。 于是我在robomongo中将CSUUID转换为UUID的util js文件的代码,改写成JAVA。

private String HexToBase64(String hex) {
        char[] base64Digits = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".toCharArray();
        String base64 = "";
        int group;     
        for (int i = 0; i < 30; i += 6) {
            group = Integer.parseInt(mySubString(hex, i, 6), 16);
            base64 += base64Digits[(group >> 18) & 0x3f];
            base64 += base64Digits[(group >> 12) & 0x3f];
            base64 += base64Digits[(group >> 6) & 0x3f];
            base64 += base64Digits[group & 0x3f];
        }
        group = Integer.parseInt(mySubString(hex, 30, 2), 16);
        base64 += base64Digits[(group >> 2) & 0x3f];
        base64 += base64Digits[(group << 4) & 0x3f];
        base64 += "==";
        return base64;
    }
    private String mySubString(String myString, int start, int length) {
        return myString.substring(start, Math.min(start + length, myString.length()));
    }
    private String CSUUID(String csuuid) {
        String hex = csuuid.replaceAll("[{}-]", ""); // remove extra characters
        String a = mySubString(hex, 6, 2) + mySubString(hex, 4, 2) + mySubString(hex, 2, 2) + mySubString(hex, 0, 2);
        String b = mySubString(hex, 10, 2) + mySubString(hex, 8, 2);
        String c = mySubString(hex, 14, 2) + mySubString(hex, 12, 2);
        String d = mySubString(hex, 16, 16);
        hex = a + b + c + d;
        String base64 = HexToBase64(hex);               
        //return base64.getBytes(StandardCharsets.UTF_8);
        return base64;
    }

现在要通过 CSUUID 执行查询需要执行这样的查询:

var user = _mongo.findOne(Query.query(Criteria.where("_id").is(new Binary(Bytes.B_UUID, Base64.getDecoder().decode(CSUUID(id.toString()))))), User.class);  

谢谢!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 2015-10-27
    • 1970-01-01
    相关资源
    最近更新 更多