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


当前回答

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

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

其他回答

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

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

JohnnyHK建议:

在某些情况下,就像@JohnnyHK建议的那样,你会想要获得一个纯Javascript的对象。 如本Mongoose文档所述,还有另一种直接作为对象查询数据的方法:

const docs = await Model.find().lean();

有条件地返回Plain Object:

此外,如果有人想有条件地转向一个对象,它也可以作为一个选项参数,参见find() docs的第三个参数:

const toObject = true;
const docs = await Model.find({},null,{lean:toObject});

它可用于函数:find(), findOne(), findById(), findOneAndUpdate(),和findByIdAndUpdate()。

注意:

值得一提的是,_id属性不是一个字符串对象,就像你会做JSON.parse(JSON.stringify(object))一样,而是一个来自mongoose类型的ObjectId,所以当它与字符串比较时,将它转换为字符串之前

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

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

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

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

您还可以对对象进行字符串化,然后再次解析以生成正常的对象。 例如:-

const obj = JSON.parse(JSON.stringify(mongoObj))