Node.js 如何将Mongoose文档转换为普通对象?
我有一个来自mongoose find的文档,我想在JSON编码并作为响应发送之前对其进行扩展。如果我尝试将属性添加到文档中,它将被忽略。属性不会出现在Node.js 如何将Mongoose文档转换为普通对象?,node.js,mongoose,Node.js,Mongoose,我有一个来自mongoose find的文档,我想在JSON编码并作为响应发送之前对其进行扩展。如果我尝试将属性添加到文档中,它将被忽略。属性不会出现在对象中。getOwnPropertyNames(doc)使正常扩展不可能。奇怪的是,JSON.parse(JSON.encode(doc))工作并返回一个具有所有正确属性的对象。有更好的方法吗?Mongoose模型s继承自文档s,它有一个toObject()方法。我相信您正在寻找的应该是doc.toObject()的结果 Mongoose模型s继
对象中。getOwnPropertyNames(doc)
使正常扩展不可能。奇怪的是,JSON.parse(JSON.encode(doc))
工作并返回一个具有所有正确属性的对象。有更好的方法吗?Mongoose模型
s继承自文档
s,它有一个toObject()
方法。我相信您正在寻找的应该是doc.toObject()
的结果
Mongoose
模型
s继承自文档
s,该文档具有toObject()
方法。我相信您正在寻找的应该是doc.toObject()
的结果
另一种方法是告诉Mongoose,您只需要在查询链中使用返回文档的纯JavaScript版本。这样,Mongoose就跳过了创建完整模型实例的步骤,您可以直接获得一个
doc
,您可以修改:
MyModel.findOne().lean().exec(function(err, doc) {
doc.addedProperty = 'foobar';
res.json(doc);
});
另一种方法是告诉Mongoose,您只需要在查询链中使用返回文档的纯JavaScript版本。这样,Mongoose就跳过了创建完整模型实例的步骤,您可以直接获得一个
doc
,您可以修改:
MyModel.findOne().lean().exec(function(err, doc) {
doc.addedProperty = 'foobar';
res.json(doc);
});
如果特性不在模型中,快速方法是:
document.set(键,值,{strict:false})编码>如果属性不在模型中,则快速方法是:
document.set(键,值,{strict:false})
解决此类问题的更好方法是像这样使用doc.toObject()
doc.toObject({ getters: true })
其他选择包括:
getter:
应用所有getter(路径和虚拟getter)
virtuals:
应用虚拟getter(可以覆盖getter选项)
最小化:
删除空对象(默认为true)
transform:
返回前应用于结果文档的转换函数
取消填充:
取消填充任何已填充路径,并将其替换为原始引用(默认为false)
versionKey:
是否包含版本密钥(默认为true)
比如你可以说
Model.findOne().exec((err, doc) => {
if (!err) {
doc.toObject({ getters: true })
console.log('doc _id:', doc._id)
}
})
现在它将起作用
如需参考,请参阅:解决此类问题的更好方法是使用类似这样的doc.toObject()
doc.toObject({ getters: true })
其他选择包括:
getter:
应用所有getter(路径和虚拟getter)
virtuals:
应用虚拟getter(可以覆盖getter选项)
最小化:
删除空对象(默认为true)
transform:
返回前应用于结果文档的转换函数
取消填充:
取消填充任何已填充路径,并将其替换为原始引用(默认为false)
versionKey:
是否包含版本密钥(默认为true)
比如你可以说
Model.findOne().exec((err, doc) => {
if (!err) {
doc.toObject({ getters: true })
console.log('doc _id:', doc._id)
}
})
现在它将起作用
请参阅:为了从Mongoose文档中获取普通对象,我使用了\u doc
属性,如下所示
mongooseDoc._doc //returns plain json object
我尝试使用toObject
,但它给了我函数、参数和所有其他我不需要的东西。为了从Mongoose文档中获取普通对象,我使用了\u doc
属性,如下所示
mongooseDoc._doc //returns plain json object
我尝试了toObject
,但它给了我函数、参数和所有其他我不需要的东西。您还可以对对象进行字符串化,然后再次解析以生成普通对象。
例如:
const obj = JSON.parse(JSON.stringify(mongoObj))
您还可以将对象字符串化,然后再次解析以生成普通对象。
例如:
const obj = JSON.parse(JSON.stringify(mongoObj))
强尼建议:
在某些情况下,正如@JohnnyHK所建议的,您可能希望以普通Javascript的形式获取对象。
如本节所述,还有另一种直接作为对象查询数据的方法:
const docs = await Model.find().lean();
有条件返回普通对象:
此外,如果有人可能希望有条件地转向某个对象,也可以作为选项
参数,请参见第三个参数:
const toObject = true;
const docs = await Model.find({},null,{lean:toObject});
它在以下函数中可用:find()
,findOne()
,findById()
,findOneAndUpdate()
,以及findByIdAndUpdate()
注:
还值得一提的是,\u id
属性不是一个字符串对象,就像您要执行JSON.parse(JSON.stringify(object))
一样,而是一个来自mongoose类型的ObjectId,因此在将其与字符串进行比较时,将其转换为前面的字符串:string(object.\u id)==otherStringId
JohnnyHK建议:
在某些情况下,正如@JohnnyHK所建议的,您可能希望以普通Javascript的形式获取对象。
如本节所述,还有另一种直接作为对象查询数据的方法:
const docs = await Model.find().lean();
有条件返回普通对象:
此外,如果有人可能希望有条件地转向某个对象,也可以作为选项
参数,请参见第三个参数:
const toObject = true;
const docs = await Model.find({},null,{lean:toObject});
它在以下函数中可用:find()
,findOne()
,findById()
,findOneAndUpdate()
,以及findByIdAndUpdate()
注:
还有一点值得一提的是,\u id
属性不是一个字符串对象,就像您要执行JSON.parse(JSON.stringify(object))
一样,而是一个来自mongoose类型的ObjectId,因此在将其与字符串进行比较时,将其转换为前面的字符串:string(object.\u id)===otherStringId
选项告诉Mongoose跳过对结果文档的水合作用。这使得查询速度更快,内存占用更少,但结果文档是普通的旧JavaScript对象(POJO),而不是Mongoose文档
const leanDoc = await MyModel.findOne().lean();
不需要使用JSON.parse(