복붙노트

[MONGODB] 문자열로 몽고에서 BinData UUID를 가져옵니다

MONGODB

문자열로 몽고에서 BinData UUID를 가져옵니다

나는 현재 (처리에 필요한)의 UUID로 몽고에 저장된 일부 ID를 가지고있다. 그들은 다음과 같이 반환받을 :

"_id" : new BinData(3, "JliB6gIMRuSphAD2KmhzgQ==")

디버깅 문자열로이 값을 설정하는 쉬운 방법이 있을까요?

그냥 명확하게하기 - 응용 프로그램이 데이터 벌금을 처리 할 수 ​​있습니다. 난 그냥 빨리 몽고의 실제 UUID를 얻을 수있는 방법이 필요합니다.

해결법

  1. ==============================

    1.귀하의 질문에 대한 대답은 더 당신이 기대하는 것이 복잡하다! 이 복잡 ​​주된 이유는 역사적 이유 (불행히도) 서로 다른 드라이버는 서로 다른 바이트 순서를 사용하여 데이터베이스에 UUID를 작성한 것입니다. 당신은 당신이 사용하고있는 드라이버를 언급하지 않는,하지만 난 예제로 C #을 드라이버를 사용합니다.

    귀하의 질문에 대한 대답은 더 당신이 기대하는 것이 복잡하다! 이 복잡 ​​주된 이유는 역사적 이유 (불행히도) 서로 다른 드라이버는 서로 다른 바이트 순서를 사용하여 데이터베이스에 UUID를 작성한 것입니다. 당신은 당신이 사용하고있는 드라이버를 언급하지 않는,하지만 난 예제로 C #을 드라이버를 사용합니다.

    나는이 문서를 삽입하려면 다음 코드를 사용 가정 :

    var guid = new Guid("00112233-4455-6677-8899-aabbccddeeff");
    collection.Insert(new BsonDocument {
        { "_id", guid },
        { "x", 1 }
    });
    

    나는 다음 몽고 쉘을 사용하여 문서를 검토하는 경우는 다음과 같습니다 :

    > db.test.findOne()
    { "_id" : BinData(3,"MyIRAFVEd2aImaq7zN3u/w=="), "x" : 1 }
    >
    

    몽고 쉘은 내장 된 기능이라고 육각 당신이 16 진수 문자열로 이진 값을 표시하는 데 사용할 수있다 :

    > var doc = db.test.findOne()
    > doc._id.hex()
    33221100554477668899aabbccddeeff
    >
    

    주의 깊게 봐 : C # 프로그램에 사용 된 원래의 UUID 값과 일치하지 않는 16 진수 문자열의 바이트 순서. 의는 C # 드라이버 (몇 달 동안 발견되지 않은 사실 슬프게 기괴한 순서로 바이트를 반환) Guid를 클래스의 마이크로 소프트의 ToByteArray 메소드에 의해 반환되는 바이트 순서를 사용하기 때문입니다. 다른 드라이버는 자신의 특이성이있다.

    우리는 몽고 쉘에로드 할 수있는 자바 스크립트로 작성된 일부 도우미 기능을 가지고이 함께 도움이됩니다. 그들은이 파일에 정의되어 있습니다 :

    https://github.com/mongodb/mongo-csharp-driver/blob/master/uuidhelpers.js

    몽고 쉘은합니다 (--shell 인수와 함께) 명령 줄에서 파일의 이름을 제공하여 시동 파일을 처리 할 말 할 수 있습니다. 우리가 만들고 UUID가 있습니다 BinData 값을 표시하기 위해 헬퍼 함수의 숫자에 대한 액세스 권한이 파일을로드 데. 예를 들면 :

    C:\mongodb\mongodb-win32-x86_64-2.0.1\bin>mongo --shell uuidhelpers.js
    MongoDB shell version: 2.0.1
    connecting to: test
    type "help" for help
    > var doc = db.test.findOne()
    > doc._id.toCSUUID()
    CSUUID("00112233-4455-6677-8899-aabbccddeeff")
    > db.test.find({_id : CSUUID("00112233-4455-6677-8899-aabbccddeeff")})
    { "_id" : BinData(3,"MyIRAFVEd2aImaq7zN3u/w=="), "x" : 1 }
    >
    

    이 예에서 toCSUUID 함수는 CSUUID 같은 BinData 값을 표시하기 위해 사용되며 CSUUID 기능 우리는 UUID에 질의 할 수 있도록 C # 1 운전 바이트 순서 규칙을 사용 UUID 대한 BinData 값을 생성하는데 사용된다. 다른 드라이버 (toJUUID, toPYUUID, JUUID, PYUUID)에 대한 유사한 기능이 있습니다.

    미래에 언젠가는 모든 드라이버는 표준 바이트 순서로 새로운 이진 하위 유형 4에 표준화됩니다. 한편에서는 경기가 어떤 드라이버를 사용하는 것이 적절한 도우미 함수를 사용해야합니다.

  2. ==============================

    2.쿼리하기 전에이 기능을 사용합니다 :

    쿼리하기 전에이 기능을 사용합니다 :

    function ToGUID(hex) {
        var a = hex.substr(6, 2) + hex.substr(4, 2) + hex.substr(2, 2) + hex.substr(0, 2);
        var b = hex.substr(10, 2) + hex.substr(8, 2);
        var c = hex.substr(14, 2) + hex.substr(12, 2);
        var d = hex.substr(16, 16);
        hex = a + b + c + d;
        var uuid = hex.substr(0, 8) + '-' + hex.substr(8, 4) + '-' + hex.substr(12, 4) + '-' + hex.substr(16, 4) + '-' + hex.substr(20, 12);
        return '"' + uuid + '"';
    }
    
    var id = new BinData(3, "JliB6gIMRuSphAD2KmhzgQ==");
    ToGUID(id.hex());
    

    결과: "ea815826-0c02-e446-a984-00f62a687381"

  3. ==============================

    3.자바 스프링 데이터를 사용하는 경우, 당신은이 알고리즘을 사용할 수 있습니다 :

    자바 스프링 데이터를 사용하는 경우, 당신은이 알고리즘을 사용할 수 있습니다 :

    function ToUUID(hex) {
        var msb = hex.substr(0, 16);
        var lsb = hex.substr(16, 16);
        msb = msb.substr(14, 2) + msb.substr(12, 2) + msb.substr(10, 2) + msb.substr(8, 2) + msb.substr(6, 2) + msb.substr(4, 2) + msb.substr(2, 2) + msb.substr(0, 2);
        lsb = lsb.substr(14, 2) + lsb.substr(12, 2) + lsb.substr(10, 2) + lsb.substr(8, 2) + lsb.substr(6, 2) + lsb.substr(4, 2) + lsb.substr(2, 2) + lsb.substr(0, 2);
        hex = msb + lsb;
        var uuid = hex.substr(0, 8) + '-' + hex.substr(8, 4) + '-' + hex.substr(12, 4) + '-' + hex.substr(16, 4) + '-' + hex.substr(20, 12);
    
        return uuid;
    }
    
  4. ==============================

    4.

    def binaryToUUID(byte: Array[Byte]): String = {
    
      if (byte == null) null
    
      else {
        val bb = ByteBuffer.wrap(byte)
        new UUID(bb.getLong, bb.getLong()).toString
      }
    }
    
  5. from https://stackoverflow.com/questions/8244110/get-bindata-uuid-from-mongo-as-string by cc-by-sa and MIT license