programing

Mongo에서 문자열로 BinData UUID 가져오기

newstyles 2023. 5. 4. 19:43

Mongo에서 문자열로 BinData UUID 가져오기

현재 Mongo에 UUID(처리에 필요한)로 저장된 ID가 있습니다.다음과 같이 반환됩니다.

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

디버깅을 위해 이 값을 문자열로 변환하는 쉬운 방법은 무엇입니까?

확실히 하자면, 애플리케이션은 데이터를 잘 처리할 수 있습니다.저는 Mongo에서 실제 UUID를 빨리 받을 수 있는 방법이 필요합니다.

당신의 질문에 대한 답은 당신이 예상하는 것보다 더 복잡합니다!(불행히도) 과거의 이유로 서로 다른 드라이버가 서로 다른 바이트 순서를 사용하여 데이터베이스에 UUID를 작성했기 때문에 복잡합니다.어떤 드라이버를 사용하고 있는지는 언급하지 않았지만 C# 드라이버를 예로 들어 보겠습니다.

다음 코드를 사용하여 문서를 삽입한다고 가정합니다.

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

그런 다음 Mongo 셸을 사용하여 문서를 검사하면 다음과 같습니다.

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

Mongo 셸에는 이진 값을 16진수 문자열로 표시하는 데 사용할 수 있는 hex라는 내장 함수가 있습니다.

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

주의 깊게 보세요: 16진수 문자열의 바이트 순서가 C# 프로그램에 사용된 원래 UUID 값과 일치하지 않습니다.이는 C# 드라이버가 Guid 클래스의 Microsoft ToByteArray 메서드에서 반환한 바이트 순서를 사용하기 때문입니다(슬프게도 여러 달 동안 발견되지 않은 이상한 순서로 바이트를 반환함).다른 운전자들은 그들만의 독특함을 가지고 있습니다.

이를 돕기 위해 우리는 Mongo 쉘에 로드할 수 있는 Javascript로 작성된 몇 가지 도우미 기능을 가지고 있습니다.다음 파일에 정의되어 있습니다.

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

Mongo 셸은 명령행에 파일 이름을 제공하여 시작할 때 파일을 처리하도록 지시받을 수 있습니다(--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 함수를 사용하여 BinData 값을 CSUUID로 표시하고 CSUUID 함수를 사용하여 C# 드라이버의 바이트 순서 규칙을 사용하여 UUID에 대한 BinData 값을 생성하여 UUID에 대해 쿼리할 수 있습니다.다른 운전자와 유사한 기능이 있습니다(J).UUID, toPUUID, JUUID, PUUUID).

미래의 언젠가는 모든 드라이버가 표준 바이트 순서를 가진 새로운 이진 하위 유형 4에서 표준화될 것입니다.그동안 사용 중인 드라이버와 일치하는 적절한 도우미 기능을 사용해야 합니다.

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

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"

Java 스프링 데이터를 사용하는 경우 다음 알고리즘을 사용할 수 있습니다.

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;
}
def binaryToUUID(byte: Array[Byte]): String = {

  if (byte == null) null

  else {
    val bb = ByteBuffer.wrap(byte)
    new UUID(bb.getLong, bb.getLong()).toString
  }
}

만약 당신의 mongodb 드라이버가 자바스크립트를 사용한다면, 당신은 16진수를 얻기 위해 이것을 시도할 수 있습니다.

BinData(3,"ABEiM0RVZneImaq7zN3u/w==").toString('hex');

언급URL : https://stackoverflow.com/questions/8244110/get-bindata-uuid-from-mongo-as-string