Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何将Mongoose文档转换为普通对象?_Node.js_Mongoose - Fatal编程技术网

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

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继

我有一个来自mongoose find的文档,我想在JSON编码并作为响应发送之前对其进行扩展。如果我尝试将属性添加到文档中,它将被忽略。属性不会出现在
对象中。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(