查询后在猫鼬对象中设置属性[重复]
Posted
技术标签:
【中文标题】查询后在猫鼬对象中设置属性[重复]【英文标题】:Set property in mongoose object after query [duplicate] 【发布时间】:2019-07-25 00:55:00 【问题描述】:在开发 API 时,我经常需要在 mongoDb 查询结果的结果中设置额外的属性。但我不能很好地做到这一点。例如
型号
const Cat = mongoose.model('Cat', name: String,age:Number );
查询
Cat.findOne(age:2) .then(
cat=>
cat.breed="puppy";
console.log(cat)
)
在我从 mongoDb 得到结果后,我想将 breed 的属性设置为 result ,但我不能这样做,因为该属性没有定义在架构
所以要设置一个额外的属性,我使用 hack
cat = JSON.parse(JSON.stringify(cat));
cat.favFood = "Milk"
我认为这不是一种好的编码方式。请提供一种更好的设置属性的方法并解释 hack 是如何工作的。
【问题讨论】:
【参考方案1】:您可以调用toObject
将cat
转换为常规的javascript 对象,而不是使用JSON.parse
和JSON.stringify
。
Mongoose 对象具有save
和set
等方法,可让您轻松修改和更新数据库中的相应文档。因此,他们试图禁止添加非模式属性。
或者,如果您尝试将这些值保存到数据库中,您可能希望查看strict option(默认情况下为真)。
【讨论】:
【参考方案2】:Mongoose 实际上可以使用.lean()
选项为您转换toObject
。这优于查询后的手动转换(如willis 提到的),因为它优化了猫鼬查询,跳过了来自数据库的原始 Mongo 文档到 Mongoose 对象的所有转换,留下文档作为纯 Javascript 对象。因此,您的查询将类似于以下内容:
Cat.findOne(age:2).lean().then(
cat=>
cat.breed="puppy";
console.log(cat)
)
除了跳过 Mongoose 文档到对象的转换中间件之外,结果将是相同的。但是,请注意,当您使用 .lean()
时,您会丢失所有 Mongoose 文档类方法,例如 .save()
或 .remove()
,因此如果您需要在查询后使用其中任何一个,则需要关注willis答案。
【讨论】:
以上是关于查询后在猫鼬对象中设置属性[重复]的主要内容,如果未能解决你的问题,请参考以下文章