it-swarm.cn

如何将Mongoose文档转换为普通对象?

我有一个来自mongoose的文档,我想在JSON编码之前扩展并作为响应发送出去。如果我尝试向doc添加属性,则会被忽略。这些属性不会出现在Object.getOwnPropertyNames(doc)中,无法正常扩展。奇怪的是JSON.parse(JSON.encode(doc))工作并返回一个具有所有正确属性的对象。有一个更好的方法吗?

174
respectTheCode

Mongoose Models继承自Documents,它具有toObject()方法。我相信你要找的东西应该是doc.toObject()的结果。

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

245
jmar777

另一种方法是通过在查询链中使用 lean() 告诉Mongoose您需要的只是返回文档的纯JavaScript版本。这样,Mongoose会跳过创建完整模型实例的步骤,直接获得doc,您可以修改:

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

如果属性不在模型中的快速方法:

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

24
alban maillere

解决这类问题的更好方法是使用doc.toObject()这样

doc.toObject({ getters: true })

其他选择包括:

  • getters:应用所有getter(路径和虚拟getter)
  • virtuals:应用虚拟getter(可以覆盖getters选项)
  • 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