Bagaimana Anda mengubah dokumen luwak menjadi objek biasa?

200

Saya punya dokumen dari luwak menemukan bahwa saya ingin memperluas sebelum JSON encoding dan mengirimkan sebagai tanggapan. Jika saya mencoba menambahkan properti ke dokumen itu diabaikan. Properti tidak muncul dalam Object.getOwnPropertyNames(doc)membuat perluasan normal tidak mungkin. Yang aneh adalah itu JSON.parse(JSON.encode(doc))berfungsi dan mengembalikan objek dengan semua properti yang benar. Apakah ada cara yang lebih baik untuk melakukan ini?

hormatilah Kode
sumber

Jawaban:

292

Warisan Modelluwak dari Documents, yang memiliki toObject()metode. Saya percaya apa yang Anda cari harus menjadi hasil doc.toObject().

http://mongoosejs.com/docs/api.html#document_Document-toObject

jmar777
sumber
1
akhirnya mendapatkannya. untuk mereka yang harusObject tidak terdefinisi, pastikan untuk memanggil pada dokumen bukan model. yaitu modelName._doc.toObject ()
John
1
Ini OK tapi lean () lebih disukai.
Jason Sebring
Apakah ini berfungsi jika Anda mengembalikan array pada Model.find({})docs return adalah array. Bisakah Anda mendokumentasikan?
dongkrak
5
@jackblank jika Anda memiliki berbagai Model, maka Anda harus dapat memetakannya:var docArray = modelArray.map(function(model) { return model.toObject(); });
jmar777
@ jmar777 saya pikir saran Anda milik sebagai edit pada jawaban ini.
r3wt
201

Cara lain untuk melakukan ini adalah memberi tahu Mongoose bahwa yang Anda butuhkan hanyalah versi JavaScript polos dari dokumen yang dikembalikan dengan menggunakan lean()dalam rantai kueri. Dengan cara itu Mongoose melompati langkah membuat contoh model lengkap dan Anda langsung mendapatkan docAnda dapat memodifikasi:

MyModel.findOne().lean().exec(function(err, doc) {
    doc.addedProperty = 'foobar';
    res.json(doc);
});
JohnnyHK
sumber
17
@Startec Menggunakan leanumumnya lebih berkinerja karena Anda melewatkan overhead pertama membuat dokumen Mongoose penuh.
JohnnyHK
3
Anda seorang juara :) koreksi saya jika saya salah, tetapi Anda harus selalu bersandar () menemukan () Anda jika Anda tidak bermaksud untuk memodifikasi dan menyimpan dokumen yang baru saja Anda terima (katakanlah, jika Anda hanya mencoba mengakses doc dan kirimkan kembali ke klien Anda)
Amarsh
1
@Amarsh Ya, meskipun itu juga dengan asumsi Anda tidak memerlukan metode instance atau virtual yang ditentukan dalam skema.
JohnnyHK
1
meskipun aneh ... ini bisa menjadi pilihan dengan find () ... sering kali terlalu umum untuk membaca dokumen dari mongodb dan mengirimkannya kembali ke browser web. Saya ingin tahu apakah find (). lean () sebenarnya berarti find () pertama dan kemudian menerapkan lean () dari setiap elemen dalam hasilnya, dalam hal ini, find (). lean () kombinasi sebenarnya akan lebih lambat daripada find () diri.
Amarsh
4
@Amarsh Tidak, merantai lean()pada kueri menetapkan opsi sebelum kueri benar-benar dieksekusi (oleh exec) sehingga hasilnya langsung dalam bentuk "lean" mereka. Lihat pertanyaan ini untuk sisi dampak panggilan kinerja yang positif lean.
JohnnyHK
29

cara cepat jika properti tidak ada dalam model:

document.set( key,value, { strict: false });

alban maillere
sumber
5
ya ... dan betapa mengejutkannya kelihatannya, saya masih berpikir ini bisa berguna. Misalnya Anda menyimpan semua objek primitif Anda.
alban maillere
Terima kasih atas jawaban ini, itu yang saya cari :)
datUser
6

Cara yang lebih baik untuk mengatasi masalah seperti ini adalah menggunakan doc.toObject()seperti ini

doc.toObject({ getters: true })

opsi lain termasuk:

  • getters: terapkan semua getter (jalur dan getter virtual)
  • virtuals: terapkan getter virtual (dapat mengesampingkan opsi getter)
  • minimize: menghapus objek kosong (default ke true)
  • transform: fungsi transformasi untuk diterapkan ke dokumen yang dihasilkan sebelum kembali
  • depopulate: turunkan populasi jalur apa pun yang diisi, ganti dengan referensi aslinya (default ke false)
  • versionKey: apakah akan memasukkan kunci versi (default ke true)

jadi misalnya bisa dibilang

Model.findOne().exec((err, doc) => {
   if (!err) {
      doc.toObject({ getters: true })
      console.log('doc _id:', doc._id)
   }
})

dan sekarang ini akan bekerja.

Untuk referensi, lihat: http://mongoosejs.com/docs/api.html#document_Document-toObject

Jalasem
sumber
3

Untuk mendapatkan objek biasa dari dokumen luwak, saya menggunakan _docproperti sebagai berikut

mongooseDoc._doc  //returns plain json object

Saya mencoba toObjecttetapi memberi saya fungsi, argumen dan semua hal lain yang tidak saya butuhkan.

dd619
sumber
3
Mengakses properti atau metode _pada awalnya bukanlah solusi yang ideal. Menggunakan lean dapat menyelesaikan kasus Anda.
Arthur Costa
@ ArthurBrito ya. Ini bukan solusi ideal tetapi masih SOLUSI! . Tidak perlu downvote jawaban. Saya telah menggunakan _docproperti berkali-kali tanpa menghadapi masalah apa pun. Dan menggunakan leanmetode memberi Anda objek polos di mana Anda tidak dapat melakukan operasi model luwak.
dd619
kamu benar. Cukup tambahkan jawaban Anda yang bukan solusi ideal maka saya akan menghapus downvote (saya tidak dapat menghapus kecuali Anda diedit)
Arthur Costa
2

Anda juga dapat merender objek dan kemudian mengurai untuk membuat objek normal. Misalnya seperti: -

const obj = JSON.parse(JSON.stringify(mongoObj))
kaushik_pm
sumber