Saya bertanya-tanya apakah ada cara untuk memaksa entri koleksi unik tetapi hanya jika entri tidak null . e Contoh skema:
var UsersSchema = new Schema({
name : {type: String, trim: true, index: true, required: true},
email : {type: String, trim: true, index: true, unique: true}
});
'email' dalam hal ini tidak diperlukan tetapi jika 'email' disimpan, saya ingin memastikan bahwa entri ini unik (pada tingkat database).
Entri kosong sepertinya mendapatkan nilai 'null' sehingga setiap entri tanpa email crash dengan opsi 'unik' (jika ada pengguna berbeda tanpa email).
Saat ini saya sedang menyelesaikannya pada level aplikasi, tetapi ingin menyimpan kueri db itu.
Terima kasih
email
bidang, bukan di tempat yang sebenarnya ada nilainull
. Lihat jawaban yang diperbarui.tl; dr
Ya, mungkin saja memiliki beberapa dokumen dengan bidang disetel ke
null
atau tidak ditentukan, sambil menerapkan nilai "aktual" yang unik.persyaratan :
string
atauobject
jika tidaknull
).Jika Anda tidak tertarik dengan detailnya, silakan langsung ke
implementation
bagian ini.versi yang lebih panjang
Untuk melengkapi jawaban @ Nolan, dimulai dengan MongoDB v3.2 Anda dapat menggunakan indeks unik parsial dengan ekspresi filter.
Ekspresi filter parsial memiliki batasan. Ini hanya dapat mencakup yang berikut:
Ini berarti ungkapan sepele
{"yourField"{$ne: null}}
tidak dapat digunakan.Namun, dengan asumsi bahwa bidang Anda selalu menggunakan tipe yang sama , Anda dapat menggunakan
$type
ekspresi .MongoDB v3.6 menambahkan dukungan untuk menentukan beberapa jenis yang mungkin, yang dapat diteruskan sebagai array:
yang berarti bahwa ini memungkinkan nilai menjadi salah satu dari sejumlah tipe ganda jika tidak
null
.Oleh karena itu, jika kita ingin mengizinkan
email
bidang pada contoh di bawah ini untuk menerima salah satustring
atau, katakanlah,binary data
nilai,$type
ekspresi yang sesuai adalah:penerapan
luwak
Anda dapat menentukannya dalam skema luwak:
atau langsung tambahkan ke koleksi (yang menggunakan driver node.js asli):
sopir mongodb asli
menggunakan
collection.createIndex
cangkang mongodb
menggunakan
db.collection.createIndex
:Ini akan memungkinkan memasukkan beberapa catatan dengan
null
email, atau tanpa bidang email sama sekali, tetapi tidak dengan string email yang sama.sumber
unique
dansparse
). Saya memperbarui skema saya dengan jawaban ini, menghapus indeks saya yang ada, dan itu bekerja seperti pesona.Hanya pembaruan singkat untuk mereka yang meneliti topik ini.
Jawaban yang dipilih akan berfungsi, tetapi Anda mungkin ingin mempertimbangkan untuk menggunakan indeks parsial.
Dokumentasi lebih lanjut tentang indeks parsial: https://docs.mongodb.com/manual/core/index-p Partial /
sumber
Sebenarnya, hanya dokumen pertama di mana "email" sebagai field tidak ada akan berhasil disimpan. Penyimpanan selanjutnya di mana "email" tidak ada akan gagal saat memberikan kesalahan (lihat potongan kode di bawah). Untuk alasannya, lihat dokumentasi resmi MongoDB sehubungan dengan Indeks Unik dan Kunci yang Hilang di sini di http://www.mongodb.org/display/DOCS/Indexes#Indexes-UniqueIndexes .
Menurut definisi, indeks unik hanya dapat mengizinkan satu nilai untuk disimpan hanya sekali. Jika Anda menganggap null sebagai salah satu nilai tersebut, itu hanya dapat disisipkan sekali! Anda benar dalam pendekatan Anda dengan memastikan dan memvalidasinya di tingkat aplikasi. Begitulah cara melakukannya.
Anda mungkin juga ingin membaca ini http://www.mongodb.org/display/DOCS/Querying+and+nulls
sumber