Indeks unik mongodb tidak berfungsi

Bahkan perpustakaan populer seperti Mongoose membuat indeks unik di bawah tenda untuk menerapkan validasi unik pada koleksi Mongo

Bagaimana cara kerja indeks unik di bawah tenda?

Indeks unik memastikan bahwa nilai tertentu dapat disimpan hanya sekali untuk bidang tertentu. Setiap kali Anda membuat koleksi di Mongo, indeks unik dibuat secara otomatis di bidang _id. Inilah yang memastikan bahwa tidak ada dua dokumen dengan _id yang sama yang disimpan

Indeks unik diberlakukan sebelum, selama, dan setelah pembuatan

Jika Anda memiliki data dalam kumpulan yang tidak unik untuk bidang tertentu, maka Anda akan mendapatkan kesalahan DuplicateKey saat membuat indeks di tempat pertama

Ini termasuk tidak adanya bidang target. Jika dokumen dalam koleksi Anda tidak memiliki bidang x dan Anda membuat indeks unik pada x, maka Anda tidak dapat menambahkan dokumen baru tanpa bidang x. Ini karena x yang hilang pada dua dokumen tidaklah unik

Dengan menggunakan konsep yang sama ini, Anda dapat memastikan keunikan di bidang lain. Hal-hal seperti email, nama pengguna, kartu kredit, SSN, nomor telepon adalah kandidat kuat untuk keunikan

Bagaimana cara membuat indeks unik di MongoDB?

Membuat indeks unik memerlukan penyetelan bendera unik ke true

db.people.createIndex({email:1}, {unique:true})

Perhatikan bagaimana {unique. true} adalah opsi yang ditentukan saat membuat indeks apa pun

Sekarang jika Anda mencoba menambahkan dua dokumen dengan nilai yang sama untuk email, Anda akan mendapatkan kesalahan Kunci Duplikat

Perhatikan bahwa jika koleksi Anda sudah memiliki nilai duplikat untuk bidang yang Anda coba buat indeks uniknya, itu juga akan menimbulkan kesalahan

Sementara contoh ini mendemonstrasikan penambahan bendera unik ke indeks bidang tunggal, Anda juga bisa membuat indeks gabungan menjadi unik

db.getCollection('people').createIndex({email:1,user:1}, {unique:true})
_

Sekarang jika Anda mencoba memasukkan dua dokumen dengan nilai yang sama untuk email DAN pengguna, Anda akan mendapatkan kesalahan Kunci Duplikat

dan ketika saya memulai server saya dan melakukan pengujian API saya menggunakan Paw (REST Client seperti Postman), saya menemukan bahwa saya dapat memasukkan email yang sama berulang kali dan bukan itu yang saya inginkan

Saya pergi ke Google seperti biasa untuk mencari solusi atas ketidaknormalan ini, berikut hal yang saya coba tidak berhasil

Mulai ulang MongoDB
dan kemudian melakukan hal berikut
mongo mydb
db. pengguna. indeks ulang()

ketika yang di atas tidak berhasil, saya yang di bawah ini

UserSchema.index({ username: 1, email: 1 }, { unique: true});

ketika yang ini juga tidak berfungsi, saya juga diminta untuk memodifikasi kode saya dengan ini

import uniqueValidator from 'mongoose-unique-validator'

// UserSchema = Schema({}) etc...

UserSchema.plugin(uniqueValidator)

Masuk ke mode layar penuh Keluar dari mode layar penuh


javascript

Saya tidak melakukan ini karena merasa sangat tidak nyaman menggunakan plugin untuk menerapkan batasan unik pada bidang tertentu

Saya benar-benar tidak tahu mengapa solusi yang disebutkan di atas tidak berhasil sama sekali untuk saya. Namun, saya menemukan solusi yang menghasilkan keajaiban, dan menurut saya metode ini adalah pendekatan terbaik

menemukan pendekatan ini yang berhasil untuk saya, tidak menyadari bahwa $gt dapat digunakan dengan cara ini
db. ce. buatIndeks(
{ manajemen_ip. 1},
{ unik. benar, partialFilterExpression. { manajemen_ip. { “$ada”. benar, “$gt”. “0”, “$ketik”. "rangkaian" }} }
)

Saya memiliki tabel bernama website dan url bidangnya bisa berupa null atau tipe string, dan saya membuat indeks unik di atasnya dengan partialFilter

db.website.createIndex(
    {"url": 1}, 
    {unique: true, partialFilterExpression: {url: {$type: "string"}}}
);

Namun, ketika saya melakukan kueri seperti

db.website.find({url: "mongo"}).explain()
_

Saya dapat melihat MongoDB memilih untuk menggunakan COLLSCAN daripada menggunakan indeks IXSCAN. Dalam kasus saya karena nilai url yang saya berikan adalah string, dan harus dicakup oleh index. Mengapa mongo memilih untuk melakukan COLLSCAN penuh?

Ketika saya menjalankan kueri $or sederhana di mana saya memeriksa bidang kit1 dan kit2 saya berharap itu akan menggunakan indeks. Tetapi fitur penjelasan memberi tahu saya bahwa tidak ada indeks yang tersedia untuk kueri ini

Nilai nol adalah pengganti untuk nilai yang tidak diketahui dalam kedua kasus, tetapi semantik untuk perbandingan dan pengindeksan mungkin berbeda tergantung pada database yang Anda bandingkan. Misalnya, SQL Server digunakan untuk (dan mungkin masih) melarang banyak nol dalam indeks unik secara default – Anda harus membuat indeks unik yang difilter (analog dengan indeks parsial di MongoDB)

Saya pikir cara paling mudah untuk mengabaikan null nilai untuk keperluan indeks unik adalah dengan menghindari serialisasi null nilai properti. Misalnya, jika Anda menggunakan dukungan POJO driver Java MongoDB, ini terjadi secara default (lihat )

Untuk informasi lebih lanjut tentang semantik null_ di MongoDB, silakan lihat Permintaan untuk Null atau Bidang yang Hilang

Indeks unik mongodb tidak berfungsi
Rafiul_Ahad

Ya. Dan tidak ada yang berhasil sejauh ini

Sepertinya Anda telah menemukan solusi yang dapat diterima untuk kasus penggunaan Anda

Jika bukan itu masalahnya atau Anda sedang mencari saran lebih lanjut tentang topik ini, berikan beberapa informasi lebih lanjut tentang lingkungan Anda

  • versi driver Java (dan ODM seperti data Spring, jika ada)
  • versi server MongoDB
  • bagaimana Anda membuat indeks unik
  • pesan kesalahan atau perilaku tak terduga yang Anda amati saat mencoba menyisipkan dokumen dengan nilai null

Per jawaban yang Anda rujuk dari Stack Overflow, Anda juga dapat menggunakan pencocokan partialFilterExpression pada jenis untuk mengindeks subkumpulan dokumen berdasarkan jenis bidang (misalnya yang fieldName nilainya adalah string ). Namun, seperti yang disebutkan dalam filter indeks parsial tidak akan dipilih oleh perencana kueri kecuali kueri menyertakan filter yang sama

MongoDB tidak akan menggunakan indeks parsial untuk kueri atau operasi pengurutan jika menggunakan indeks menghasilkan kumpulan hasil yang tidak lengkap

Untuk menggunakan indeks parsial, kueri harus berisi ekspresi filter (atau ekspresi filter yang dimodifikasi yang menentukan subkumpulan ekspresi filter) sebagai bagian dari kondisi kuerinya

Bagaimana cara mengatur indeks unik di MongoDB?

Untuk membuat indeks unik, gunakan db. koleksi. createIndex() metode dengan opsi unik disetel ke true .

Bisakah indeks tidak unik?

Indeks non-unik tidak digunakan untuk menerapkan batasan pada tabel yang terkait dengannya . Sebagai gantinya, indeks non-unik digunakan semata-mata untuk meningkatkan kinerja kueri dengan mempertahankan urutan terurut dari nilai data yang sering digunakan.

Bagaimana cara menggunakan unik di MongoDB?

Untuk mendapatkan nilai unik dan mengabaikan duplikat, gunakan perbedaan() di MongoDB . yang berbeda () menemukan nilai yang berbeda untuk bidang yang ditentukan di seluruh koleksi tunggal dan mengembalikan hasilnya dalam sebuah larik.

Bagaimana cara membuat bidang unik di MongoDB menggunakan Mongoose?

var SimSchema = Skema baru({ msisdn. { jenis. Tali, unik. benar, wajib. benar }, imsi. { Tipe. Tali, unik. benar, wajib. benar}, status. { jenis. Boolean, standar. benar}, sinyal. { jenis. Number}, probe_name. { Tipe. Tali, diperlukan. BENAR } });