Mongoose: FindOne mengembalikan nilai default dari file yang tidak ada.

Dibuat pada 23 Jul 2016  ·  3Komentar  ·  Sumber: Automattic/mongoose

_Pertama: Solusi untuk mengatasi masalah ini:_
Model.findOne({id: 'blabla'}).select('email password createdAt').lean().exec()

isu:

Saya menggunakan bidang createdAt - yang memiliki kedaluwarsa (TTL 24h ) dan nilai default ( Date.now ) - dalam model Users untuk menyimpan pembuatan info tanggal dari pengguna yang baru dibuat.

Jika pengguna mengaktifkan akun, sistem menghapus bidang createdAt .
Jika pengguna tidak mengaktifkan akun, sistem akan menghapus akun dari koleksi Users setelah 24 jam.

Dalam operasi otentikasi saya, saya memeriksa bidang createdAt terlebih dahulu.
Jika pengguna tidak diaktifkan, saya menampilkan pesan seperti Account is not activated.

Ketika saya mencoba metode FindOne untuk tujuan prosedur otentikasi di atas, saya mendapatkan nilai Date.now meskipun tidak ada bidang createdAt dalam dokumen karena pengguna telah mengaktifkan akunnya .

createdAt bidang di saya User Model:
createdAt: { type: Date, expires: '24h', default: Date.now },

Metode saya:
Users.findOne({email: username}, 'email, password, createdAt', function(err, user) {

Dengan menggunakan metode di atas nilai createdAt kembali setiap saat.

ps: saya mencari masalah tetapi saya tidak bisa apa-apa.

Komentar yang paling membantu

Tersandung pada masalah yang sama.
@vkarpov15 seharusnya tidak bekerja seperti itu. Meskipun nilai default diatur pada penyimpanan, itu menyesatkan untuk mengaturnya ketika find dokumen, karena itu sebenarnya mengembalikan data persis yang disimpan dalam DB, bukan? Saya akan memilih untuk membuka kembali masalah ini.

Semua 3 komentar

Begitulah cara kerja default, ketika tidak ada bidang createdAt di doc luwak akan menambahkannya. Jika Anda hanya ingin menambahkan createdAt saat membuat dokumen baru:

schema.pre('save', function(next) {
  if (this.isNew) {
    this.createdAt = Date.now();
  }
  next();
});

Juga, saya tidak akan merekomendasikan memisahkan bidang dalam proyeksi Anda Users.findOne({email: username}, 'email, password, createdAt' /** <-- remove commas here */) dengan koma.

Tersandung pada masalah yang sama.
@vkarpov15 seharusnya tidak bekerja seperti itu. Meskipun nilai default diatur pada penyimpanan, itu menyesatkan untuk mengaturnya ketika find dokumen, karena itu sebenarnya mengembalikan data persis yang disimpan dalam DB, bukan? Saya akan memilih untuk membuka kembali masalah ini.

Belum tentu, luwak memiliki banyak tempat di mana dokumen tidak mewakili data persis yang disimpan di db: getter, virtual, dll. Bagaimanapun, kami menegaskan perilaku ini dan mengubahnya akan merusak banyak kode orang, jadi kami tidak akan mengubahnya kecuali ada banyak permintaan untuk mengubahnya. Berikut solusinya:

createdAt: {
  type: Date,
  default: function() {
    if (this.isNew) { return new Date(); }
    return undefined;
  }
}

Ini akan membuat createdAt hanya disetel saat menyimpan ke database, tetapi akan menjadi undefined jika Anda memuat dokumen dari db dan createdAt tidak mengatur.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat