首页 文章

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

提问于
浏览
161

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

4 回答

  • 169

    Mongoose Model s继承自 Document ,它有一个 toObject() 方法 . 我相信你所寻找的应该是 doc.toObject() 的结果 .

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

  • 234

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

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

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

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

  • 1

    解决这类问题的更好方法是使用_1837219这样的

    doc.toObject({ getters: true })
    

    其他选择包括:

    • getters: 应用所有getter(路径和虚拟getter)

    • virtuals: 应用虚拟getter(可以覆盖getter选项)

    • minimize: 删除空对象(默认为true)

    • transform: 一个转换函数,在返回之前应用于生成的文档

    • depopulate: 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

相关问题