web-dev-qa-db-ja.com

Mongooseドキュメントをどのようにしてプレーンオブジェクトに変換しますか?

私は、JSONエンコードおよび応答として送信する前に拡張したいというマングースの発見からの文書を持っています。プロパティをドキュメントに追加しようとしても無視されます。プロパティはObject.getOwnPropertyNames(doc)に表示されないため、通常の拡張はできません。奇妙なことに、JSON.parse(JSON.encode(doc))が機能し、すべての正しいプロパティを持つオブジェクトを返します。これを行うためのより良い方法はありますか?

177
respectTheCode

Mongoose Modelsは、toObject()メソッドを持つDocumentsを継承します。あなたが探しているのはdoc.toObject()の結果だと思います。

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

249
jmar777

これを行うもう1つの方法は、クエリチェーンで lean() を使用して、返されるドキュメントのプレーンなJavaScriptバージョンだけが必要であることをMongooseに伝えることです。そのようにして、Mongooseは完全なモデルインスタンスを作成するステップをスキップし、変更可能なdocを直接取得します。

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

プロパティがモデルにない場合の高速な方法:

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

25
alban maillere

このような問題に取り組むためのより良い方法は、このようなdoc.toObject()を使用することです

doc.toObject({ getters: true })

その他のオプションは次のとおりです。

  • getters:はすべてのゲッター(パスおよび仮想ゲッター)を適用します
  • virtuals:は仮想ゲッターを適用します(ゲッターオプションをオーバーライドできます)
  • minimize:は空のオブジェクトを削除します(デフォルトはtrue)
  • transform:返される前に結果のドキュメントに適用する変換関数
  • depopulate:は入力されたパスをすべて削除し、元の参照に置き換えます(デフォルトはfalse)
  • versionKey:バージョンキーを含めるかどうか(デフォルトはtrue)

たとえば、あなたは言うことができます

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

そして今、それは動作します。

参照については、以下を参照してください: http://mongoosejs.com/docs/api.html#document_Document-toObject

2
Jalasem

Mongooseドキュメントからプレーンオブジェクトを取得するには、次のように_docプロパティを使用しました

mongooseDoc._doc  //returns plain json object

toObjectを試してみましたが、機能、引数、必要のない他のすべてのものをくれました。

0
dd619