我有一个文档从猫鼬发现,我想在JSON编码和发送作为响应之前扩展。如果我尝试向文档添加属性,它会被忽略。属性不会出现在Object.getOwnPropertyNames(doc)中,因此不可能进行正常的扩展。奇怪的是,JSON.parse(JSON.encode(doc))工作并返回一个具有所有正确属性的对象。还有更好的办法吗?


当前回答

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

文档。Set (key,value, {strict: false});

其他回答

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

doc.toObject({ getters: true })

其他选项包括:

Getters:应用所有Getters(路径和虚拟Getters) Virtuals:应用虚拟getter(可以覆盖getter选项) 最小化:删除空对象(默认为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

我一直在我的文档上使用toObject方法,但没有成功。 我需要添加平坦地图属性为true,最终有一个POJO。

const data = document.data.toObject({ flattenMaps: true });

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

文档。Set (key,value, {strict: false});

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

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

为了从Mongoose文档中获取普通对象,我使用_doc属性,如下所示

mongooseDoc._doc  //returns plain json object

我尝试了toObject,但它给了我函数,参数和所有其他我不需要的东西。