私は、JSONエンコードおよび応答として送信する前に拡張したいというマングースの発見からの文書を持っています。プロパティをドキュメントに追加しようとしても無視されます。プロパティはObject.getOwnPropertyNames(doc)
に表示されないため、通常の拡張はできません。奇妙なことに、JSON.parse(JSON.encode(doc))
が機能し、すべての正しいプロパティを持つオブジェクトを返します。これを行うためのより良い方法はありますか?
Mongoose Model
sは、toObject()
メソッドを持つDocument
sを継承します。あなたが探しているのはdoc.toObject()
の結果だと思います。
http://mongoosejs.com/docs/api.html#document_Document-toObject
これを行うもう1つの方法は、クエリチェーンで lean()
を使用して、返されるドキュメントのプレーンなJavaScriptバージョンだけが必要であることをMongooseに伝えることです。そのようにして、Mongooseは完全なモデルインスタンスを作成するステップをスキップし、変更可能なdoc
を直接取得します。
MyModel.findOne().lean().exec(function(err, doc) {
doc.addedProperty = 'foobar';
res.json(doc);
});
プロパティがモデルにない場合の高速な方法:
document.set( key,value, { strict: false });
このような問題に取り組むためのより良い方法は、このような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
Mongooseドキュメントからプレーンオブジェクトを取得するには、次のように_doc
プロパティを使用しました
mongooseDoc._doc //returns plain json object
toObject
を試してみましたが、機能、引数、必要のない他のすべてのものをくれました。