PyMongo vận chuyển với hỗ trợ tích hợp để xử lý các loại UUID. Thật đơn giản để lưu trữ các đối tượng
00112233-4455-6677-8899-aabbccddeeff3 gốc vào MongoDB và truy xuất chúng dưới dạng các đối tượng
00112233-4455-6677-8899-aabbccddeeff3 gốc
from pymongo import MongoClient from bson.binary import UuidRepresentation from uuid import uuid4 # use the 'standard' representation for cross-language compatibility. client = MongoClient[uuidRepresentation='standard'] collection = client.get_database['uuid_db'].get_collection['uuid_coll'] # remove all documents from collection collection.delete_many[{}] # create a native uuid object uuid_obj = uuid4[] # save the native uuid object to MongoDB collection.insert_one[{'uuid': uuid_obj}] # retrieve the stored uuid object from MongoDB document = collection.find_one[{}] # check that the retrieved UUID matches the inserted UUID assert document['uuid'] == uuid_obj
Các đối tượng gốc
00112233-4455-6677-8899-aabbccddeeff3 cũng có thể được sử dụng như một phần của truy vấn MongoDB
document = collection.find[{'uuid': uuid_obj}] assert document['uuid'] == uuid_obj
Các ví dụ trên minh họa trường hợp sử dụng đơn giản nhất - trường hợp mà UUID được tạo bởi và được sử dụng trong cùng một ứng dụng. Tuy nhiên, tình huống có thể phức tạp hơn đáng kể khi xử lý việc triển khai MongoDB có chứa các UUID được tạo bởi các trình điều khiển khác vì các trình điều khiển Java và CSharp đã mã hóa các UUID trong lịch sử bằng cách sử dụng thứ tự byte khác với thứ tự được sử dụng bởi PyMongo. Các ứng dụng yêu cầu khả năng tương tác giữa các trình điều khiển này phải chỉ định
00112233-4455-6677-8899-aabbccddeeff6 thích hợp
Trong các phần sau, chúng tôi mô tả cách các trình điều khiển khác nhau về mặt lịch sử trong mã hóa UUID của chúng và cách các ứng dụng có thể sử dụng tùy chọn cấu hình
00112233-4455-6677-8899-aabbccddeeff6 để duy trì khả năng tương thích giữa các ngôn ngữ
Chú ý
Các ứng dụng mới không chia sẻ triển khai MongoDB với bất kỳ ứng dụng nào khác và chưa từng lưu trữ UUID trong MongoDB nên sử dụng đại diện UUID của
00112233-4455-6677-8899-aabbccddeeff8 để tương thích giữa các ngôn ngữ. Xem Định cấu hình Đại diện UUID để biết chi tiết về cách định cấu hình
00112233-4455-6677-8899-aabbccddeeff6.
Xử lý kế thừa dữ liệu UUID¶
Trong lịch sử, Trình điều khiển MongoDB đã sử dụng các thứ tự byte khác nhau trong khi tuần tự hóa các loại UUID thành
00112233-4455-6677-8899-aabbccddeeff0. Ví dụ, hãy xem xét một UUID với biểu diễn văn bản chính tắc sau
00112233-4455-6677-8899-aabbccddeeff
UUID này trong lịch sử sẽ được trình điều khiển Python tuần tự hóa dưới dạng
00112233-4455-6677-8899-aabbccddeeff
UUID tương tự trong lịch sử sẽ được trình điều khiển C# tuần tự hóa như
00112233-4455-6677-8899-aabbccddeeff2
Cuối cùng, cùng một UUID trong lịch sử sẽ được trình điều khiển Java tuần tự hóa thành
00112233-4455-6677-8899-aabbccddeeff3
Ghi chú
Để biết thông tin chuyên sâu về thứ tự byte được sử dụng trong lịch sử bởi các trình điều khiển khác nhau, hãy xem Xử lý đặc tả loại UUID gốc
Sự khác biệt về thứ tự byte của UUID được mã hóa bởi các trình điều khiển khác nhau có thể dẫn đến hành vi rất không trực quan trong một số trường hợp. Chúng tôi trình bày chi tiết hai kịch bản như vậy trong các phần tiếp theo
cảnh 1. Ứng dụng Chia sẻ Triển khai MongoDB¶
Xem xét tình huống sau
Ứng dụng
00112233-4455-6677-8899-aabbccddeeff
1 được viết bằng C# tạo ra một UUID và sử dụng nó làm00112233-4455-6677-8899-aabbccddeeff
2 của một tài liệu mà nó tiến hành chèn vào bộ sưu tập00112233-4455-6677-8899-aabbccddeeff
3 của cơ sở dữ liệu00112233-4455-6677-8899-aabbccddeeff
4. Giả sử rằng biểu diễn văn bản chuẩn của UUID được tạo là00112233-4455-6677-8899-aabbccddeeff
Ứng dụng
00112233-4455-6677-8899-aabbccddeeff
5 được viết bằng Python cố gắng00112233-4455-6677-8899-aabbccddeeff
6 tài liệu được viết bởi ứng dụng00112233-4455-6677-8899-aabbccddeeff
1 theo cách saufrom pymongo import MongoClient from bson.binary import UuidRepresentation from uuid import uuid4 # use the 'standard' representation for cross-language compatibility. client = MongoClient[uuidRepresentation='standard'] collection = client.get_database['uuid_db'].get_collection['uuid_coll'] # remove all documents from collection collection.delete_many[{}] # create a native uuid object uuid_obj = uuid4[] # save the native uuid object to MongoDB collection.insert_one[{'uuid': uuid_obj}] # retrieve the stored uuid object from MongoDB document = collection.find_one[{}] # check that the retrieved UUID matches the inserted UUID assert document['uuid'] == uuid_obj
2Trong trường hợp này,
00112233-4455-6677-8899-aabbccddeeff
8 sẽ không bao giờ là tài liệu được ứng dụng00112233-4455-6677-8899-aabbccddeeff
1 chèn vào ở bước trước. Điều này là do thứ tự byte khác nhau được trình điều khiển C# sử dụng để biểu thị UUID dưới dạng nhị phân BSON. Mặt khác, truy vấn sau đây sẽ tìm thành công tài liệu nàyfrom pymongo import MongoClient from bson.binary import UuidRepresentation from uuid import uuid4 # use the 'standard' representation for cross-language compatibility. client = MongoClient[uuidRepresentation='standard'] collection = client.get_database['uuid_db'].get_collection['uuid_coll'] # remove all documents from collection collection.delete_many[{}] # create a native uuid object uuid_obj = uuid4[] # save the native uuid object to MongoDB collection.insert_one[{'uuid': uuid_obj}] # retrieve the stored uuid object from MongoDB document = collection.find_one[{}] # check that the retrieved UUID matches the inserted UUID assert document['uuid'] == uuid_obj
5
Ví dụ này cho thấy thứ tự byte khác nhau được sử dụng bởi các trình điều khiển khác nhau có thể cản trở khả năng tương tác như thế nào. Để khắc phục sự cố này, người dùng nên định cấu hình
00112233-4455-6677-8899-aabbccddeeff20 của họ bằng
00112233-4455-6677-8899-aabbccddeeff6 thích hợp [trong trường hợp này,
00112233-4455-6677-8899-aabbccddeeff22 trong ứng dụng
00112233-4455-6677-8899-aabbccddeeff5 có thể được định cấu hình để sử dụng biểu diễn
00112233-4455-6677-8899-aabbccddeeff24 nhằm tránh hành vi không trực quan] như được mô tả trong Định cấu hình . .
kịch bản 2. Round-Tripping UUID¶
Trong các ví dụ sau, chúng ta thấy cách sử dụng
00112233-4455-6677-8899-aabbccddeeff6 bị định cấu hình sai có thể khiến ứng dụng vô tình thay đổi loại phụ
00112233-4455-6677-8899-aabbccddeeff0 và trong một số trường hợp, chính các byte của trường
00112233-4455-6677-8899-aabbccddeeff0 khi chuyển vòng tài liệu chứa UUID
Xem xét tình huống sau
00112233-4455-6677-8899-aabbccddeeff4
Trong ví dụ này, quay vòng tài liệu bằng cách sử dụng sai
00112233-4455-6677-8899-aabbccddeeff6 [
00112233-4455-6677-8899-aabbccddeeff29 thay vì
00112233-4455-6677-8899-aabbccddeeff30] sẽ thay đổi loại phụ
00112233-4455-6677-8899-aabbccddeeff0 dưới dạng tác dụng phụ. Lưu ý rằng điều này cũng có thể xảy ra khi tình huống đảo ngược - i. e. khi tài liệu gốc được viết bằng cách sử dụng biểu diễn ``STANDARD`` và sau đó được lặp lại bằng cách sử dụng biểu diễn ``PYTHON_LEGACY``
Trong ví dụ tiếp theo, chúng ta thấy hậu quả của việc sử dụng sai cách biểu diễn làm thay đổi thứ tự byte [
00112233-4455-6677-8899-aabbccddeeff24 hoặc
00112233-4455-6677-8899-aabbccddeeff33] khi chuyển đổi tài liệu
document = collection.find[{'uuid': uuid_obj}] assert document['uuid'] == uuid_obj0
Trong trường hợp này, việc sử dụng sai
00112233-4455-6677-8899-aabbccddeeff6 [
00112233-4455-6677-8899-aabbccddeeff33 thay vì
00112233-4455-6677-8899-aabbccddeeff29] sẽ thay đổi các byte và kiểu phụ của
00112233-4455-6677-8899-aabbccddeeff0 dưới dạng tác dụng phụ. Lưu ý rằng điều này xảy ra khi bất kỳ biểu diễn nào thao túng thứ tự byte [``CSHARP_LEGACY`` hoặc ``JAVA_LEGACY``] được sử dụng không chính xác cho các UUID khứ hồi được viết bằng ``STANDARD``. Khi tình thế đảo ngược - tôi. e. khi tài liệu gốc được viết bằng cách sử dụng ``CSHARP_LEGACY`` hoặc ``Java_LEGACY`` và sau đó chuyển đổi vòng lặp bằng cách sử dụng ``STANDARD`` - chỉ. tầng lớp. `~bson. nhị phân. Loại phụ nhị phân` được thay đổi
Ghi chú
Bắt đầu từ PyMongo 4. 0, những vấn đề này sẽ được giải quyết khi biểu diễn
00112233-4455-6677-8899-aabbccddeeff29 sẽ giải mã các trường kiểu con Nhị phân 3 thành các đối tượng kiểu con 3
00112233-4455-6677-8899-aabbccddeeff0 [thay vì
00112233-4455-6677-8899-aabbccddeeff3] và mỗi biểu diễn
00112233-4455-6677-8899-aabbccddeeff1 sẽ giải mã các trường kiểu con nhị phân 4 thành
00112233-4455-6677-8899-aabbccddeeff0 đối tượng của kiểu con 4 [thay vì
Cấu hình một Đại diện UUID¶
Người dùng có thể giải quyết các sự cố được mô tả ở trên bằng cách định cấu hình ứng dụng của họ bằng
00112233-4455-6677-8899-aabbccddeeff6 thích hợp. Định cấu hình biểu diễn sẽ sửa đổi hành vi của PyMongo trong khi mã hóa các đối tượng
00112233-4455-6677-8899-aabbccddeeff3 thành BSON và giải mã các trường loại phụ 3 và 4 nhị phân từ BSON
Các ứng dụng có thể đặt biểu diễn UUID theo một trong các cách sau
Ở cấp độ
00112233-4455-6677-8899-aabbccddeeff
20 bằng cách sử dụng tùy chọn URI00112233-4455-6677-8899-aabbccddeeff
7, e. gdocument = collection.find[{'uuid': uuid_obj}] assert document['uuid'] == uuid_obj
1Giá trị hợp lệ là
Giá trị
Đại diện UUID
00112233-4455-6677-8899-aabbccddeeff
8KHÔNG XÁC ĐỊNH
00112233-4455-6677-8899-aabbccddeeff
8TIÊU CHUẨN
from pymongo import MongoClient from bson.binary import UuidRepresentation from uuid import uuid4 # use the 'standard' representation for cross-language compatibility. client = MongoClient[uuidRepresentation='standard'] collection = client.get_database['uuid_db'].get_collection['uuid_coll'] # remove all documents from collection collection.delete_many[{}] # create a native uuid object uuid_obj = uuid4[] # save the native uuid object to MongoDB collection.insert_one[{'uuid': uuid_obj}] # retrieve the stored uuid object from MongoDB document = collection.find_one[{}] # check that the retrieved UUID matches the inserted UUID assert document['uuid'] == uuid_obj
20PYTHON_LEGACY
from pymongo import MongoClient from bson.binary import UuidRepresentation from uuid import uuid4 # use the 'standard' representation for cross-language compatibility. client = MongoClient[uuidRepresentation='standard'] collection = client.get_database['uuid_db'].get_collection['uuid_coll'] # remove all documents from collection collection.delete_many[{}] # create a native uuid object uuid_obj = uuid4[] # save the native uuid object to MongoDB collection.insert_one[{'uuid': uuid_obj}] # retrieve the stored uuid object from MongoDB document = collection.find_one[{}] # check that the retrieved UUID matches the inserted UUID assert document['uuid'] == uuid_obj
21Java_LEGACY
from pymongo import MongoClient from bson.binary import UuidRepresentation from uuid import uuid4 # use the 'standard' representation for cross-language compatibility. client = MongoClient[uuidRepresentation='standard'] collection = client.get_database['uuid_db'].get_collection['uuid_coll'] # remove all documents from collection collection.delete_many[{}] # create a native uuid object uuid_obj = uuid4[] # save the native uuid object to MongoDB collection.insert_one[{'uuid': uuid_obj}] # retrieve the stored uuid object from MongoDB document = collection.find_one[{}] # check that the retrieved UUID matches the inserted UUID assert document['uuid'] == uuid_obj
22CSHARP_LEGACY
Ở cấp độ
00112233-4455-6677-8899-aabbccddeeff
20 sử dụng tùy chọn00112233-4455-6677-8899-aabbccddeeff
7 kwarg, e. gdocument = collection.find[{'uuid': uuid_obj}] assert document['uuid'] == uuid_obj
2Ở cấp độ
from pymongo import MongoClient from bson.binary import UuidRepresentation from uuid import uuid4 # use the 'standard' representation for cross-language compatibility. client = MongoClient[uuidRepresentation='standard'] collection = client.get_database['uuid_db'].get_collection['uuid_coll'] # remove all documents from collection collection.delete_many[{}] # create a native uuid object uuid_obj = uuid4[] # save the native uuid object to MongoDB collection.insert_one[{'uuid': uuid_obj}] # retrieve the stored uuid object from MongoDB document = collection.find_one[{}] # check that the retrieved UUID matches the inserted UUID assert document['uuid'] == uuid_obj
25 hoặcfrom pymongo import MongoClient from bson.binary import UuidRepresentation from uuid import uuid4 # use the 'standard' representation for cross-language compatibility. client = MongoClient[uuidRepresentation='standard'] collection = client.get_database['uuid_db'].get_collection['uuid_coll'] # remove all documents from collection collection.delete_many[{}] # create a native uuid object uuid_obj = uuid4[] # save the native uuid object to MongoDB collection.insert_one[{'uuid': uuid_obj}] # retrieve the stored uuid object from MongoDB document = collection.find_one[{}] # check that the retrieved UUID matches the inserted UUID assert document['uuid'] == uuid_obj
26 bằng cách cung cấp phiên bảnfrom pymongo import MongoClient from bson.binary import UuidRepresentation from uuid import uuid4 # use the 'standard' representation for cross-language compatibility. client = MongoClient[uuidRepresentation='standard'] collection = client.get_database['uuid_db'].get_collection['uuid_coll'] # remove all documents from collection collection.delete_many[{}] # create a native uuid object uuid_obj = uuid4[] # save the native uuid object to MongoDB collection.insert_one[{'uuid': uuid_obj}] # retrieve the stored uuid object from MongoDB document = collection.find_one[{}] # check that the retrieved UUID matches the inserted UUID assert document['uuid'] == uuid_obj
27 phù hợp, e. gdocument = collection.find[{'uuid': uuid_obj}] assert document['uuid'] == uuid_obj
3
Các biểu diễn UUID được hỗ trợ¶
Đại diện UUID
Vỡ nợ?
Mã hóa
00112233-4455-6677-8899-aabbccddeeff3 thành
Giải mã
00112233-4455-6677-8899-aabbccddeeff0 tiểu loại 4 thành
Giải mã
00112233-4455-6677-8899-aabbccddeeff0 tiểu loại 3 thành
TIÊU CHUẨN
Không
00112233-4455-6677-8899-aabbccddeeff0 tiểu loại 4
00112233-4455-6677-8899-aabbccddeeff3
00112233-4455-6677-8899-aabbccddeeff0 tiểu loại 3
KHÔNG XÁC ĐỊNH
Có, trong PyMongo>=4
Tăng
from pymongo import MongoClient from bson.binary import UuidRepresentation from uuid import uuid4 # use the 'standard' representation for cross-language compatibility. client = MongoClient[uuidRepresentation='standard'] collection = client.get_database['uuid_db'].get_collection['uuid_coll'] # remove all documents from collection collection.delete_many[{}] # create a native uuid object uuid_obj = uuid4[] # save the native uuid object to MongoDB collection.insert_one[{'uuid': uuid_obj}] # retrieve the stored uuid object from MongoDB document = collection.find_one[{}] # check that the retrieved UUID matches the inserted UUID assert document['uuid'] == uuid_obj54
00112233-4455-6677-8899-aabbccddeeff0 tiểu loại 4
00112233-4455-6677-8899-aabbccddeeff0 tiểu loại 3
PYTHON_LEGACY
Không
00112233-4455-6677-8899-aabbccddeeff0 subtype 3 với thứ tự byte tiêu chuẩn
00112233-4455-6677-8899-aabbccddeeff0 tiểu loại 4
00112233-4455-6677-8899-aabbccddeeff3
Java_LEGACY
Không
00112233-4455-6677-8899-aabbccddeeff0 subtype 3 với thứ tự byte kế thừa của Java
00112233-4455-6677-8899-aabbccddeeff0 tiểu loại 4
00112233-4455-6677-8899-aabbccddeeff3
CSHARP_LEGACY
Không
00112233-4455-6677-8899-aabbccddeeff0 loại phụ 3 với thứ tự byte cũ của C#
00112233-4455-6677-8899-aabbccddeeff0 tiểu loại 4
00112233-4455-6677-8899-aabbccddeeff3
Bây giờ chúng tôi trình bày chi tiết hành vi và trường hợp sử dụng cho từng đại diện UUID được hỗ trợ
00112233-4455-6677-8899-aabbccddeeff
46¶
Chú ý
Bắt đầu từ PyMongo 4. 0,
00112233-4455-6677-8899-aabbccddeeff46 là đại diện UUID mặc định được sử dụng bởi PyMongo
Biểu diễn
00112233-4455-6677-8899-aabbccddeeff46 ngăn chặn việc giải thích sai các byte UUID bằng cách ngừng tự động chuyển đổi các trường UUID trong BSON sang các loại UUID gốc. Thay vào đó, việc giải mã UUID khi sử dụng biểu diễn này sẽ trả về một đối tượng
00112233-4455-6677-8899-aabbccddeeff0. Nếu được yêu cầu, người dùng có thể ép buộc các đối tượng
00112233-4455-6677-8899-aabbccddeeff0 đã giải mã thành UUID gốc bằng phương pháp
document = collection.find[{'uuid': uuid_obj}] assert document['uuid'] == uuid_obj01 và chỉ định định dạng biểu diễn phù hợp. Ví dụ sau đây cho thấy điều này có thể trông như thế nào đối với UUID được lưu trữ bởi trình điều khiển C#
document = collection.find[{'uuid': uuid_obj}] assert document['uuid'] == uuid_obj4
Các đối tượng gốc
00112233-4455-6677-8899-aabbccddeeff3 không thể được mã hóa trực tiếp thành
00112233-4455-6677-8899-aabbccddeeff0 khi biểu diễn UUID là
00112233-4455-6677-8899-aabbccddeeff46 và cố gắng làm như vậy sẽ dẫn đến một ngoại lệ
document = collection.find[{'uuid': uuid_obj}] assert document['uuid'] == uuid_obj5
Thay vào đó, các ứng dụng sử dụng
00112233-4455-6677-8899-aabbccddeeff46 phải ép buộc rõ ràng một UUID gốc bằng phương thức
document = collection.find[{'uuid': uuid_obj}] assert document['uuid'] == uuid_obj06
document = collection.find[{'uuid': uuid_obj}] assert document['uuid'] == uuid_obj6
00112233-4455-6677-8899-aabbccddeeff
29¶
Chú ý
Biểu diễn UUID này nên được sử dụng bởi các ứng dụng mới hoặc ứng dụng mã hóa và/hoặc giải mã UUID trong MongoDB lần đầu tiên
Biểu diễn
00112233-4455-6677-8899-aabbccddeeff29 cho phép khả năng tương thích đa ngôn ngữ bằng cách đảm bảo thứ tự byte giống nhau khi mã hóa UUID từ tất cả các trình điều khiển. UUID được viết bởi một trình điều khiển với đại diện này được định cấu hình sẽ được xử lý chính xác bởi mọi trình điều khiển khác miễn là nó cũng được định cấu hình với đại diện
00112233-4455-6677-8899-aabbccddeeff29
00112233-4455-6677-8899-aabbccddeeff29 mã hóa các đối tượng
00112233-4455-6677-8899-aabbccddeeff3 gốc thành các đối tượng loại 4 phụ của
00112233-4455-6677-8899-aabbccddeeff0
00112233-4455-6677-8899-aabbccddeeff
30¶
Chú ý
Biểu diễn uuid này nên được sử dụng khi đọc các UUID được tạo bởi các ứng dụng hiện có sử dụng trình điều khiển Python nhưng không đặt biểu diễn UUID một cách rõ ràng
Chú ý
00112233-4455-6677-8899-aabbccddeeff30 là đại diện uuid mặc định trong PyMongo 3
Biểu diễn
00112233-4455-6677-8899-aabbccddeeff30 tương ứng với biểu diễn cũ của UUID được sử dụng bởi PyMongo. Đại diện này phù hợp với RFC 4122 Mục 4. 1. 2
Ví dụ sau minh họa việc sử dụng biểu diễn này
document = collection.find[{'uuid': uuid_obj}] assert document['uuid'] == uuid_obj7
00112233-4455-6677-8899-aabbccddeeff30 mã hóa các đối tượng
00112233-4455-6677-8899-aabbccddeeff3 gốc thành các đối tượng loại phụ 3 của
00112233-4455-6677-8899-aabbccddeeff0, giữ nguyên thứ tự byte giống như
document = collection.find[{'uuid': uuid_obj}] assert document['uuid'] == uuid_obj19
document = collection.find[{'uuid': uuid_obj}] assert document['uuid'] == uuid_obj8
00112233-4455-6677-8899-aabbccddeeff
33¶
Chú ý
Biểu diễn UUID này nên được sử dụng khi đọc các UUID được ghi vào MongoDB bởi các ứng dụng kế thừa [i. e. các ứng dụng không sử dụng biểu diễn
00112233-4455-6677-8899-aabbccddeeff29] bằng trình điều khiển Java
Biểu diễn
00112233-4455-6677-8899-aabbccddeeff33 tương ứng với biểu diễn cũ của UUID được sử dụng bởi Trình điều khiển Java MongoDB
Ghi chú
Biểu diễn
00112233-4455-6677-8899-aabbccddeeff33 đảo ngược thứ tự của byte 0-7 và byte 8-15
Ví dụ: hãy xem xét cùng một UUID được mô tả trong Xử lý dữ liệu UUID cũ . Giả sử rằng một ứng dụng đã sử dụng trình điều khiển Java mà không có biểu diễn UUID được chỉ định rõ ràng để chèn ví dụ UUID
document = collection.find[{'uuid': uuid_obj}] assert document['uuid'] == uuid_obj24 vào MongoDB. Nếu chúng tôi cố gắng đọc giá trị này bằng cách sử dụng
00112233-4455-6677-8899-aabbccddeeff30, chúng tôi sẽ nhận được một UUID hoàn toàn khác.
document = collection.find[{'uuid': uuid_obj}] assert document['uuid'] == uuid_obj9
Tuy nhiên, nếu chúng tôi đặt biểu diễn rõ ràng thành
00112233-4455-6677-8899-aabbccddeeff33, chúng tôi sẽ nhận được kết quả chính xác
00112233-4455-6677-8899-aabbccddeeff0
PyMongo sử dụng biểu diễn UUID được chỉ định để sắp xếp lại các byte BSON và tải chúng một cách chính xác.
00112233-4455-6677-8899-aabbccddeeff24 mã hóa các đối tượng
00112233-4455-6677-8899-aabbccddeeff3 gốc thành các đối tượng loại phụ 3 của
00112233-4455-6677-8899-aabbccddeeff0, đồng thời thực hiện sắp xếp lại byte tương tự như bộ mã hóa UUID sang BSON của trình điều khiển C# kế thừa