Bir Mongoose belgesini düz bir nesneye nasıl dönüştürürsünüz?


200

Ben bir mongoose JSON kodlama ve yanıt olarak göndermeden önce genişletmek istiyorum bulmak bir belge var. Dokümana özellikler eklemeyi denersem ihmal edilir. Özellikler Object.getOwnPropertyNames(doc)normal bir uzatmayı mümkün kılmıyor gibi görünmüyor. Garip olan şey, JSON.parse(JSON.encode(doc))tüm doğru özelliklere sahip bir nesneyi çalıştırması ve döndürmesidir. Bunu yapmanın daha iyi bir yolu var mı?

Yanıtlar:


292

Firavun faresi , bir yöntemi olan Models'den miras alır . Aradığın şeyin sonucu olması gerektiğine inanıyorum .DocumenttoObject()doc.toObject()

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


1
sonunda anladım. undefined işlevini kaldırmak zorunda olanlar için model yerine belgeyi aradığınızdan emin olun. ie modelName._doc.toObject ()
John

1
Bu sorun yok ama yalın () tercih ediliyor.
Jason Sebring

Model.find({})Dokümanlar dönüşünde dizi döndürürseniz, bu çalışır bir dizi. Docs.toObject yapabilir misiniz?
jack blank

5
@jackblank Eğer bir dizi Modeliniz varsa, bunları eşleştirebilmelisiniz:var docArray = modelArray.map(function(model) { return model.toObject(); });
jmar777

@ jmar777 Bence öneri bu cevapta bir düzenleme olarak ait.
r3wt

202

Bunu yapmanın başka bir yolu da Mongoose'a tek yapmanız gereken, lean()sorgu zincirinde kullanarak döndürülen dokümanın düz bir JavaScript sürümüdür . Bu şekilde Mongoose, tam model örneğini oluşturma adımını atlar ve doğrudan bir docdeğişiklik yapabilirsiniz:

MyModel.findOne().lean().exec(function(err, doc) {
    doc.addedProperty = 'foobar';
    res.json(doc);
});

17
@Startec Kullanmak leangenellikle daha performanslıdır, çünkü ilk önce Mongoose belgesinin tamamını oluşturmanın yükünü atlarsınız .
JohnnyHK

3
sen bir şampiyonsun :) eğer yanılıyorsam beni düzeltin, ama yeni aldığınız belgeyi değiştirmek ve kaydetmek istemiyorsanız (örneğin, yalnızca erişmeye çalışıyorsanız doc ve müşterinize geri göndermek)
Amarsh

1
@Amarsh Evet, her ne kadar bu da şemada tanımlanan örnek yöntemlere veya sanallara ihtiyacınız olmadığını varsayar.
JohnnyHK

1
bizzare olsa ... bu find () ile bir seçenek olabilir ... bir mongodb bir belgeyi okumak ve bir web tarayıcısına geri göndermek için genellikle çok yaygın. acaba find (). lean () aslında önce find () anlamına gelir ve daha sonra sonuçta her öğenin bir lean () uygulamak, bu durumda, find (). lean () kombinasyonu aslında find () daha yavaş olurdu kendisi.
Amarsh

4
@Amarsh Hayır, lean()sorgu üzerinde zincirleme , sorgu execdoğrudan çalıştırılmadan (tarafından ) seçeneği ayarlar, böylece sonuçlar doğrudan "yalın" formunda olur. Aramanın olumlu performans etkisi tarafı için bu soruya bakın lean.
JohnnyHK

29

özellik modelde değilse hızlı yol:

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


5
evet ... ve göründüğü kadar şaşırtıcı, yine de bunun yararlı olabileceğini düşünüyorum. Örneğin, nesnenizin tüm ilkelerini koruyorsunuz.
alban maillere

Bu cevap için teşekkürler, aradığım şey buydu :)
datUser

6

Böyle bir sorunu ele almanın daha iyi bir yolu kullanıyor doc.toObject()böyle

doc.toObject({ getters: true })

diğer seçenekler:

  • getters: tüm alıcıları uygula (yol ve sanal alıcılar)
  • virtuals: sanal alıcıları uygula (alıcıları geçersiz kılabilir)
  • minimize: boş nesneleri kaldır (varsayılan değer true)
  • transform: dönmeden önce ortaya çıkan belgeye uygulanacak bir dönüştürme işlevi
  • depopulate: doldurulmuş yolları doldurun ve orijinal referanslarıyla değiştirin (varsayılanı false değerindedir)
  • versionKey: sürüm anahtarının dahil edilip edilmeyeceği (varsayılanı true değerindedir)

yani örneğin diyebilirsiniz

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

ve şimdi işe yarayacak.

Referans için bkz. Http://mongoosejs.com/docs/api.html#document_Document-toObject


3

Mongoose belgesinden düz nesne almak için _docözelliği aşağıdaki gibi kullandım

mongooseDoc._doc  //returns plain json object

Denedim toObjectama bana fonksiyonları, argümanları ve ihtiyacım olmayan diğer şeyleri verdi.


3
_Başlangıçta özelliklere veya yöntemlere erişmek ideal çözüm değildir. Yalın kullanmak durumunuzu çözebilir.
Arthur Costa

@ArthurBrito evet. İdeal bir çözüm değil ama hala bir ÇÖZÜM! . Cevabı küçümsemeye gerek yok. _docHerhangi bir sorunla karşılaşmadan birçok kez mülk kullandım . Ve leanyöntemini kullanmak , üzerinde tek renkli model işlemlerini gerçekleştiremeyeceğiniz düz bir nesne sağlar.
dd619

haklısın. Sadece o zaman (siz düzenlenmiş sürece kaldıramazsınız) downvote kaldırırız ideal çözüm olmadığını Cevabınız eklemek
Arthur Costa

1

Ayrıca nesneyi dizgi yapabilir ve sonra normal nesneyi yapmak için yeniden ayrıştırabilirsiniz. Örneğin: -

const obj = JSON.parse(JSON.stringify(mongoObj))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.