MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Nhận BinData UUID từ Mongo dưới dạng chuỗi

Câu trả lời cho câu hỏi của bạn phức tạp hơn mà bạn mong đợi! Lý do chính khiến nó phức tạp là vì lý do lịch sử (không may) các trình điều khiển khác nhau đã ghi UUID vào cơ sở dữ liệu bằng cách sử dụng các thứ tự byte khác nhau. Bạn không đề cập đến trình điều khiển nào bạn đang sử dụng, nhưng tôi sẽ sử dụng trình điều khiển C # làm ví dụ.

Giả sử tôi sử dụng mã sau để chèn tài liệu:

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

Sau đó, nếu tôi kiểm tra tài liệu bằng cách sử dụng Mongo shell, nó sẽ giống như sau:

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

Mongo shell có một hàm tích hợp được gọi là hex mà bạn có thể sử dụng để hiển thị giá trị nhị phân dưới dạng chuỗi hex:

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

Xem kỹ:thứ tự byte của chuỗi hex không khớp với giá trị UUID ban đầu được sử dụng trong chương trình C #. Đó là bởi vì trình điều khiển C # sử dụng thứ tự byte được trả về bởi phương thức ToByteArray của Microsoft của lớp Guid (điều đáng buồn là trả về các byte theo một thứ tự kỳ lạ, mà thực tế đã không được phát hiện trong nhiều tháng). Các trình điều khiển khác có đặc điểm riêng.

Để giải quyết vấn đề này, chúng tôi có một số hàm trợ giúp được viết bằng Javascript có thể được tải vào Mongo shell. Chúng được xác định trong tệp này:

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

Mongo shell có thể được yêu cầu xử lý một tệp khi nó khởi động bằng cách cung cấp tên của tệp trên dòng lệnh (cùng với đối số --shell). Sau khi tải tệp này, chúng tôi có quyền truy cập vào một số chức năng trợ giúp để tạo và hiển thị các giá trị BinData là UUID. Ví dụ:

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 }
>

Trong ví dụ này, hàm toCSUUID được sử dụng để hiển thị giá trị BinData dưới dạng CSUUID và hàm CSUUID được sử dụng để tạo giá trị BinData cho UUID bằng cách sử dụng quy ước sắp xếp byte của trình điều khiển C # để chúng tôi có thể truy vấn trên UUID. Có các chức năng tương tự cho các trình điều khiển khác (toJUUID, toPYUUID, JUUID, PYUUID).

Một ngày nào đó trong tương lai, tất cả các trình điều khiển sẽ chuẩn hóa trên kiểu con nhị phân 4 mới với thứ tự byte tiêu chuẩn. Trong thời gian chờ đợi, bạn phải sử dụng chức năng trợ giúp thích hợp phù hợp với bất kỳ trình điều khiển nào bạn đang sử dụng.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm thế nào để kết nối với mongodb bằng sailsjs v0.10?

  2. Làm thế nào để sử dụng giao dịch MongoDB bằng Mongoose?

  3. Làm cách nào để xác thực các thành viên của một trường mảng?

  4. Xác thực ứng dụng NodeJS và MongoDB bởi JWT

  5. 2 cách để có được kích thước tài liệu trong MongoDB