Berikut ini adalah user
skema saya dalam user.js
model -
var userSchema = new mongoose.Schema({
local: {
name: { type: String },
email : { type: String, require: true, unique: true },
password: { type: String, require:true },
},
facebook: {
id : { type: String },
token : { type: String },
email : { type: String },
name : { type: String }
}
});
var User = mongoose.model('User',userSchema);
module.exports = User;
Ini adalah bagaimana saya menggunakannya di controller saya -
var user = require('./../models/user.js');
Ini adalah bagaimana saya menyimpannya di db -
user({'local.email' : req.body.email, 'local.password' : req.body.password}).save(function(err, result){
if(err)
res.send(err);
else {
console.log(result);
req.session.user = result;
res.send({"code":200,"message":"Record inserted successfully"});
}
});
Kesalahan -
{"name":"MongoError","code":11000,"err":"insertDocument :: caused by :: 11000 E11000 duplicate key error index: mydb.users.$email_1 dup key: { : null }"}
Saya memeriksa koleksi db dan tidak ada entri duplikat seperti itu, beri tahu saya apa yang saya lakukan salah?
FYI - req.body.email
dan req.body.password
sedang mengambil nilai.
Saya juga memeriksa posting ini tetapi tidak ada bantuan STACK LINK
Jika saya dihapus sepenuhnya maka akan menyisipkan dokumen, jika tidak maka akan terjadi kesalahan "Duplikat" bahkan saya memiliki entri di local.email
unique: false
tidak memiliki dampak apa pun. Saya menyadari bahwa saya harus pertama-tama menjatuhkan meja dan kemudian berhasil. Anda bisa melakukan hal seperti itudb.whateverthecollection.drop({})
. Hati-hati, itu menghapus koleksi.Jawaban:
Pesan kesalahan mengatakan bahwa sudah ada catatan dengan
null
sebagai email. Dengan kata lain, Anda sudah memiliki pengguna tanpa alamat email.Dokumentasi yang relevan untuk ini:
indeks unik
Dengan kata lain, indeks jarang ok dengan beberapa dokumen semua memiliki
null
nilai.indeks jarang
Dari komentar:
Kesalahan Anda mengatakan bahwa kunci tersebut dinamai
mydb.users.$email_1
yang membuat saya curiga bahwa Anda memiliki indeks pada keduanyausers.email
danusers.local.email
(Yang lama dan tidak digunakan saat ini). Menghapus bidang dari model luwak tidak memengaruhi basis data. Periksamydb.users.getIndexes()
apakah ini masalahnya dan secara manual hapus indeks yang tidak diinginkanmydb.users.dropIndex(<name>)
.sumber
mydb.users.$email_1
yang membuat saya curiga bahwa Anda memiliki indeks pada keduanyausers.email
danusers.local.email
(Yang lama dan tidak digunakan saat ini). Menghapus bidang dari model luwak tidak memengaruhi basis data. Periksamydb.users.getIndexes()
apakah ini masalahnya dan secara manual hapus indeks yang tidak diinginkanmydb.users.dropIndex(<name>)
.db.users.dropIndexes()
jika Anda membuat banyak perubahan indeksJika Anda masih dalam lingkungan pengembangan Anda, saya akan menjatuhkan seluruh db dan memulai kembali dengan skema baru Anda.
Dari baris perintah
sumber
db.collection.dropIndexes()
seperti kataPeriksa indeks koleksi.
Saya punya masalah itu karena indeks yang sudah ketinggalan zaman dalam koleksi untuk bidang, yang harus disimpan oleh jalur baru yang berbeda.
Mongoose menambahkan indeks, saat Anda menentukan bidang sebagai unik.
sumber
Yah pada dasarnya kesalahan ini mengatakan, bahwa Anda memiliki indeks unik pada bidang tertentu misalnya: "email_address", jadi mongodb mengharapkan nilai alamat email unik untuk setiap dokumen dalam koleksi.
Jadi katakanlah, sebelumnya dalam skema Anda indeks unik tidak ditentukan, dan kemudian Anda mendaftar 2 pengguna dengan alamat email yang sama atau tanpa alamat email (nilai nol).
Kemudian, Anda melihat ada kesalahan. jadi Anda mencoba memperbaikinya dengan menambahkan indeks unik ke skema. Tetapi koleksi Anda sudah memiliki duplikat, jadi pesan kesalahan mengatakan bahwa Anda tidak dapat memasukkan nilai duplikat lagi.
Anda pada dasarnya memiliki tiga opsi:
Jatuhkan koleksi
db.users.drop();
Temukan dokumen yang memiliki nilai itu dan hapus. Katakanlah nilainya nol, Anda dapat menghapusnya menggunakan:
db.users.remove({ email_address: null });
Jatuhkan indeks Unik:
db.users.dropIndex(indexName)
Semoga ini membantu :)
sumber
Saya ingin menjelaskan jawaban / solusi untuk ini seperti saya menjelaskan kepada anak berusia 5 tahun, sehingga semua orang bisa mengerti.
Saya punya aplikasi. Saya ingin orang mendaftar dengan email, kata sandi, dan nomor telepon mereka. Dalam database MongoDB saya, saya ingin mengidentifikasi orang secara unik berdasarkan nomor telepon dan email mereka - jadi ini berarti bahwa nomor telepon dan email harus unik untuk setiap orang.
Namun, ada masalah: Saya telah menyadari bahwa setiap orang memiliki nomor telepon tetapi tidak semua orang memiliki alamat email.
Mereka yang tidak memiliki alamat email telah berjanji kepada saya bahwa mereka akan memiliki alamat email minggu depan. Tetapi saya tetap ingin agar mereka terdaftar - jadi saya memberi tahu mereka untuk melanjutkan mendaftarkan nomor telepon mereka ketika mereka membiarkan bidang input-email kosong.
Mereka melakukannya.
Basis data saya MEMBUTUHKAN bidang alamat email yang unik - tetapi saya memiliki banyak orang dengan 'nol' sebagai alamat email mereka. Jadi saya pergi ke kode saya dan memberitahu skema database saya untuk mengizinkan bidang alamat email kosong / nol yang nantinya akan saya isi dengan alamat email unik ketika orang-orang yang berjanji untuk menambahkan email mereka ke profil mereka minggu depan.
Jadi sekarang ini adalah win-win untuk semua orang (tetapi Anda; -]): orang-orang mendaftar, saya senang memiliki data mereka ... dan database saya senang karena digunakan dengan baik ... tetapi bagaimana dengan Anda? Saya belum memberi Anda kode yang membuat skema.
Berikut adalah kodenya: CATATAN: Properti jarang dalam email, adalah yang memberitahu basis data saya untuk memungkinkan nilai nol yang nantinya akan diisi dengan nilai unik.
Saya harap saya telah menjelaskannya dengan baik. Selamat NodeJS coding / peretasan!
sumber
sparse
indeks danunique
validasi, dan memiliki bidang lain yang tidak diperlukan, Anda harus menggunakanpartialFilterExpression
opsi. Lihat jawaban ini stackoverflow.com/a/34600171/728287Saya menghadapi masalah serupa, saya Hanya menghapus Indeks bidang tertentu kemudian bekerja untuk saya. https://docs.mongodb.com/v3.2/reference/method/db.collection.dropIndexes/
sumber
Dalam situasi ini, masuk ke Mongo menemukan indeks yang tidak Anda gunakan lagi (dalam kasus OP 'email'). Kemudian pilih Drop Index
sumber
Ini pengalaman saya yang relavan:
Dalam skema 'Pengguna', saya menetapkan 'nama' sebagai kunci unik dan kemudian menjalankan beberapa eksekusi, yang saya pikir telah mengatur struktur basis data.
Kemudian saya mengubah kunci unik sebagai 'nama pengguna', dan tidak lagi meneruskan nilai 'nama' ketika saya menyimpan data ke basis data. Jadi mongodb dapat secara otomatis menetapkan nilai 'nama' dari catatan baru sebagai null yang merupakan kunci duplikat. Saya mencoba menetapkan kunci 'nama' sebagai bukan kunci unik
{name: {unique: false, type: String}}
dalam skema 'Pengguna' untuk mengganti pengaturan asli. Namun, itu tidak berhasil.Akhirnya, saya membuat solusi sendiri:
Cukup tetapkan nilai kunci acak yang tidak akan mungkin menjadi duplikat untuk kunci 'nama' saat Anda menyimpan catatan data Anda. Metode sederhana Matematika
'' + Math.random() + Math.random()
membuat string acak.sumber
Saya memiliki masalah yang sama. Mencoba men-debug cara yang berbeda tidak dapat menemukannya. Saya mencoba menjatuhkan koleksinya dan berhasil setelah itu. Meskipun ini bukan solusi yang baik jika koleksi Anda memiliki banyak dokumen. Tetapi jika Anda berada dalam tahap awal pengembangan, coba jatuhkan koleksinya.
sumber
Ini karena sudah ada koleksi dengan nama yang sama dengan konfigurasi .. Cukup hapus koleksi dari mongodb Anda melalui mongo shell dan coba lagi.
sekarang jalankan aplikasi Anda itu harus berfungsi
sumber
Saya memiliki masalah yang sama dan saya menyadari bahwa secara default mongo hanya mendukung satu skema per koleksi. Simpan skema baru Anda di koleksi yang berbeda atau hapus dokumen yang ada dengan skema yang tidak kompatibel dalam koleksi Anda saat ini. Atau temukan cara untuk memiliki lebih dari satu skema per koleksi.
sumber
Saya juga menghadapi masalah ini dan saya menyelesaikannya. Kesalahan ini menunjukkan bahwa email sudah ada di sini. Jadi, Anda hanya perlu menghapus baris ini dari atribut Model untuk email Anda.
Ini mungkin terjadi bahkan jika itu tidak akan berhasil. Jadi hanya perlu menghapus koleksi dari MongoDB Anda dan restart server Anda.
sumber
Saya mendapatkan masalah yang sama ketika saya memiliki konfigurasi berikut di config / models.js saya
Mengubah migrasi dari 'ubah' ke 'aman' memperbaikinya untuk saya.
sumber
masalah yang sama setelah menghapus properti dari skema setelah terlebih dahulu membangun beberapa indeks pada tabungan. menghapus properti dari skema mengarah ke nilai nol untuk properti yang tidak ada, yang masih memiliki indeks. menjatuhkan indeks atau memulai dengan koleksi baru dari awal membantu di sini.
Catatan: pesan kesalahan akan menuntun Anda dalam kasus itu. ia memiliki jalan, yang tidak ada lagi. im kasus saya jalur lama adalah ... $ uuid_1 (ini adalah indeks!), tetapi yang baru adalah .... * priv.uuid_1
sumber
Saya memiliki masalah yang sama ketika saya mencoba untuk memodifikasi skema yang didefinisikan menggunakan mangga. Saya pikir masalah ini disebabkan oleh alasan bahwa ada beberapa proses mendasar yang dilakukan ketika membuat koleksi seperti menggambarkan indeks yang disembunyikan dari pengguna (setidaknya dalam kasus saya). Jadi solusi terbaik yang saya temukan adalah dengan menghapus seluruh koleksi dan mulai lagi.
sumber
Saya memiliki masalah yang sama. Masalahnya adalah bahwa saya telah menghapus satu bidang dari model. Ketika saya menjatuhkan db itu diperbaiki
sumber
untuk pengembang masa depan, saya sarankan, hapus indeks di TAB INDEKS menggunakan kompas ... ini BUKAN HAPUS dokumen apa pun dalam koleksi Anda Kelola Indeks
sumber
Ubah nama koleksi jika sudah ada dalam database, itu akan menampilkan kesalahan. Dan jika Anda memberikan properti apa pun sebagai unik kesalahan yang sama akan terjadi.
sumber
Punya masalah yang sama saya mengatasinya dengan menghapus
unique
atribut di properti.Temukan saja cara lain untuk memvalidasi atau memeriksa nilai properti unik untuk skema Anda.
sumber
Harap hapus koleksi atau Hapus seluruh koleksi dari database MongoDB dan coba lagi nanti.
sumber