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

Kemungkinan duplikat Mongo ObjectId dihasilkan dalam dua koleksi berbeda?

Jawaban Singkat

Hanya untuk menambahkan tanggapan langsung ke pertanyaan awal Anda:YA, jika Anda menggunakan pembuatan ID Objek BSON, maka untuk sebagian besar driver ID hampir pasti akan unik di seluruh koleksi. Lihat di bawah untuk mengetahui apa artinya "hampir pasti".

Jawaban Panjang

ID Objek BSON yang dihasilkan oleh driver Mongo DB kemungkinan besar unik di seluruh koleksi. Ini terutama karena 3 byte terakhir dari ID, yang untuk sebagian besar driver dihasilkan melalui penghitung kenaikan statis. Penghitung itu tidak bergantung pada koleksi; itu mendunia. Driver Java, misalnya, menggunakan AtomicInteger statis yang diinisialisasi secara acak.

Jadi mengapa, di dokumen Mongo, apakah mereka mengatakan bahwa ID "sangat mungkin" unik, alih-alih langsung mengatakan bahwa mereka AKAN unik? Tiga kemungkinan dapat terjadi di mana Anda tidak akan mendapatkan ID unik (beri tahu saya jika ada lebih banyak):

Sebelum diskusi ini, ingat bahwa BSON Object ID terdiri dari:

[4 byte detik sejak zaman, hash mesin 3 byte, ID proses 2 byte, penghitung 3 byte]

Berikut adalah tiga kemungkinan, jadi Anda menilai sendiri seberapa besar kemungkinan untuk mendapatkan penipuan:

1) Counter overflow:ada 3 byte di counter. Jika Anda menyisipkan lebih dari 16.777.216 (2^24) dokumen dalam satu detik, pada mesin yang sama, dalam proses yang sama, maka Anda dapat membanjiri byte penghitung yang bertambah dan berakhir dengan dua ID Objek yang berbagi waktu yang sama, mesin , proses, dan nilai penghitung.

2) Counter non-incrementing:beberapa driver Mongo menggunakan angka acak alih-alih menambah angka untuk counter byte. Dalam kasus ini, ada kemungkinan 1/16.777.216 untuk menghasilkan ID non-unik, tetapi hanya jika kedua ID tersebut dihasilkan dalam detik yang sama (yaitu sebelum bagian waktu pembaruan ID ke detik berikutnya), pada detik yang sama mesin, dalam proses yang sama.

3) Mesin dan proses hash ke nilai yang sama. ID mesin dan nilai ID proses mungkin, dalam beberapa skenario yang sangat tidak mungkin, memetakan ke nilai yang sama untuk dua mesin yang berbeda. Jika ini terjadi, dan pada saat yang sama dua penghitung pada dua mesin yang berbeda, selama detik yang sama, menghasilkan nilai yang sama, maka Anda akan mendapatkan ID duplikat.

Inilah tiga skenario yang harus diwaspadai. Skenario 1 dan 3 tampaknya sangat tidak mungkin, dan skenario 2 benar-benar dapat dihindari jika Anda menggunakan driver yang tepat. Anda harus memeriksa sumber driver untuk mengetahui dengan pasti.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Ubah string menjadi angka dalam proyeksi MongoDB

  2. Adakah alasan terperinci dan spesifik untuk Mengapa MongoDB jauh lebih cepat daripada SQL DB?

  3. MongoDb:temukan objek yang sangat bersarang dengan $lookup

  4. Apa yang terjadi dengan Meteor dan Fibers/bindEnvironment()?

  5. mongodb:kueri untuk periode waktu antara dua bidang tanggal