Làm việc với GUID có một số khó khăn, chủ yếu liên quan đến cách làm việc với biểu diễn nhị phân trong mongo shell và cả những tai nạn lịch sử dẫn đến việc các trình điều khiển khác nhau lưu trữ GUID bằng các thứ tự byte khác nhau.
Tôi đã sử dụng mã sau để minh họa các vấn đề:
var document = new BsonDocument { { "_id", Guid.NewGuid() }, { "x", 1 } };
collection.Drop();
collection.Insert(document);
Console.WriteLine("Inserted GUID: {0}", document["_id"].AsGuid);
mà khi tôi chạy nó xuất ra:
Inserted GUID: 2d25b9c6-6d30-4441-a360-47e7804c62be
khi tôi hiển thị điều này trong trình bao mongo, tôi nhận được:
> var doc = db.test.findOne()
> doc
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 }
> doc._id.hex()
c6b9252d306d4144a36047e7804c62be
>
Lưu ý rằng ngay cả khi được hiển thị dưới dạng hex, thứ tự byte không khớp với GUID ban đầu. Đó là tai nạn lịch sử mà tôi đang nói đến. Tất cả các byte đều ở đó, chúng chỉ theo một thứ tự bất thường nhờ vào việc triển khai Guid.ToByteArray () của Microsoft.
Để giúp bạn làm việc với GUID trong mongo shell, bạn có thể sao chép tệp các hàm trợ giúp sau vào thư mục lưu trữ mongo.exe:
https://github.com/rstam/mongo-csharp -driver / blob / master / uuidhelpers.js
Tệp có một số nhận xét tài liệu ngắn gọn ở trên cùng mà bạn có thể thấy hữu ích. Để cung cấp các chức năng này trong mongo shell, bạn cần yêu cầu shell mongo đọc tệp này khi nó khởi động. Xem phiên mẫu sau:
C:\mongodb\mongodb-win32-x86_64-2.0.6\bin>mongo --shell uuidhelpers.js
MongoDB shell version: 2.0.6
connecting to: test
type "help" for help
> var doc = db.test.findOne()
> doc
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 }
> doc._id.hex()
c6b9252d306d4144a36047e7804c62be
> doc._id.toCSUUID()
CSUUID("2d25b9c6-6d30-4441-a360-47e7804c62be")
>
Bạn cũng có thể sử dụng một hàm trợ giúp khác để truy vấn các GUID:
> db.test.find({_id : CSUUID("2d25b9c6-6d30-4441-a360-47e7804c62be")})
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 }
>
Về việc lưu trữ các GUID của bạn dưới dạng chuỗi, đó không phải là điều chưa từng có và nó chắc chắn giúp việc xem và truy vấn dữ liệu trong mongo shell dễ dàng hơn và tránh tất cả các vấn đề với các thứ tự byte khác nhau. Nhược điểm duy nhất là nó sử dụng nhiều không gian hơn (khoảng gấp đôi).