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

Dengan mongodb dan panduan untuk Id dokumen, apa cara efisien untuk menyimpan Panduan untuk dengan mudah mengambil Panduan yang sebenarnya?

Bekerja dengan GUID memiliki beberapa jebakan, sebagian besar terkait dengan cara bekerja dengan representasi biner di mongo shell dan juga dengan riwayat kecelakaan yang mengakibatkan driver yang berbeda menyimpan GUID menggunakan urutan byte yang berbeda.

Saya menggunakan kode berikut untuk mengilustrasikan masalah:

var document = new BsonDocument { { "_id", Guid.NewGuid() }, { "x", 1 } };
collection.Drop();
collection.Insert(document);
Console.WriteLine("Inserted GUID: {0}", document["_id"].AsGuid);

yang ketika saya menjalankannya menghasilkan:

Inserted GUID: 2d25b9c6-6d30-4441-a360-47e7804c62be

ketika saya menampilkan ini di shell mongo saya mendapatkan:

> var doc = db.test.findOne()
> doc
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 }
> doc._id.hex()
c6b9252d306d4144a36047e7804c62be
>

Perhatikan bahwa meskipun ditampilkan sebagai hex, urutan byte tidak cocok dengan GUID asli. Itulah kecelakaan sejarah yang saya bicarakan. Semua byte ada di sana, hanya dalam urutan yang tidak biasa berkat implementasi Microsoft dari Guid.ToByteArray().

Untuk membantu Anda bekerja dengan GUID di mongo shell, Anda dapat menyalin file fungsi pembantu berikut ke direktori tempat mongo.exe disimpan:

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

File memiliki beberapa komentar dokumentasi singkat di bagian atas yang mungkin berguna bagi Anda. Untuk membuat fungsi-fungsi ini tersedia di mongo shell, Anda perlu memberi tahu mongo shell untuk membaca file ini saat dijalankan. Lihat sesi contoh berikut:

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")
>

Anda juga dapat menggunakan fungsi pembantu lainnya untuk menanyakan GUID:

> db.test.find({_id : CSUUID("2d25b9c6-6d30-4441-a360-47e7804c62be")})
{ "_id" : BinData(3,"xrklLTBtQUSjYEfngExivg=="), "x" : 1 }
>

Sejauh menyimpan GUID Anda sebagai string, itu bukan hal yang tidak pernah dilakukan dan itu pasti membuat melihat dan menanyakan data di mongo shell lebih mudah dan menghindari semua masalah dengan urutan byte yang berbeda. Satu-satunya kelemahan adalah menggunakan lebih banyak ruang (kira-kira dua kali lipat).




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Masalah dalam hubungan antara Node.js dan wadah MongoDB menggunakan lingkungan var. di Docker Compose

  2. Indeks MongoDB 2dsphere gagal (geometri salah bentuk?)

  3. Grup Mongodb berdasarkan bidang menggunakan $substr

  4. mongoDB 2.2.1 - basis data tidak valid

  5. MongoDB db.runCommand() dari C#