MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Dapatkan BinData UUID dari Mongo sebagai string

Jawaban atas pertanyaan Anda lebih rumit dari yang Anda harapkan! Alasan utama rumitnya adalah karena alasan historis (sayangnya) driver yang berbeda telah menulis UUID ke database menggunakan perintah byte yang berbeda. Anda tidak menyebutkan driver mana yang Anda gunakan, tetapi saya akan menggunakan driver C# sebagai contoh.

Misalkan saya menggunakan kode berikut untuk menyisipkan dokumen:

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

Jika saya kemudian memeriksa dokumen menggunakan shell Mongo, terlihat seperti ini:

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

Shell Mongo memiliki fungsi bawaan yang disebut hex yang dapat Anda gunakan untuk menampilkan nilai biner sebagai string hex:

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

Perhatikan baik-baik:urutan byte string hex tidak cocok dengan nilai UUID asli yang digunakan dalam program C#. Itu karena driver C# menggunakan urutan byte yang dikembalikan oleh metode ToByteArray Microsoft dari kelas Guid (yang sayangnya mengembalikan byte dalam urutan yang aneh, yang faktanya tidak ditemukan selama berbulan-bulan). Pengemudi lain memiliki keistimewaannya sendiri.

Untuk membantu ini, kami memiliki beberapa fungsi pembantu yang ditulis dalam Javascript yang dapat dimuat ke dalam shell Mongo. Mereka didefinisikan dalam file ini:

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

Shell Mongo dapat diminta untuk memproses file saat dimulai dengan memberikan nama file pada baris perintah (bersama dengan argumen --shell). Setelah memuat file ini, kami memiliki akses ke sejumlah fungsi pembantu untuk membuat dan menampilkan nilai BinData yang merupakan UUID. Misalnya:

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

Dalam contoh ini fungsi toCSUUID digunakan untuk menampilkan nilai BinData sebagai CSUUID dan fungsi CSUUID digunakan untuk membuat nilai BinData untuk UUID menggunakan konvensi pengurutan byte driver C# sehingga kita dapat melakukan kueri pada UUID. Ada fungsi serupa untuk driver lain (toJUUID, toPYUUID, JUUID, PYUUID).

Suatu hari di masa depan semua driver akan menstandarisasi subtipe 4 biner baru dengan urutan byte standar. Sementara itu, Anda harus menggunakan fungsi pembantu yang sesuai yang cocok dengan driver apa pun yang Anda gunakan.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB, Mongoose:Bagaimana menemukan subdokumen dalam dokumen yang ditemukan?

  2. Bagaimana Mengakses Instans MongoDB 4.2?

  3. Hubungan Mongo DB antar objek

  4. C# mongodb - cara memperbarui elemen array bersarang

  5. Java, MongoDB:Bagaimana cara memperbarui setiap objek sambil mengulangi koleksi besar?