在开发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 的属性设置为结果,但由于该属性未定义,所以无法执行在架构
中所以要设置一个额外的属性,我要使用hack
cat = JSON.parse(JSON.stringify(cat));
cat.favFood = "Milk"
我认为这不是编码的好方法。请提供一种更好的设置属性的方法,并说明该黑客是如何工作的。
答案 0 :(得分:2)
猫鼬实际上可以通过toObject
选项为您完成.lean()
的转换。在查询后(如willis所述,此方法优于手动转换,因为它通过跳过从数据库到Mongoose对象的原始Mongo文档的所有转换来优化猫鼬查询,将文档保留为纯Javascript对象。因此,您的查询将类似于以下内容:
Cat.findOne({age:2}).lean().then(
cat=>{
cat.breed="puppy";
console.log(cat)
}
)
除将跳过Mongoose文档到对象转换中间件外,结果将相同。但是,请注意,在使用.lean()
时,您会丢失所有Mongoose文档类方法,例如.save()
或.remove()
,因此,如果您需要在之后使用任何这些方法,查询,您需要遵循willis答案。
答案 1 :(得分:1)
您可以调用toObject
来将JSON.parse
转换为常规javascript对象,而不是使用JSON.stringify
和cat
。
猫鼬对象在其上具有诸如save
和set
之类的方法,使您可以轻松地修改和更新数据库中的相应文档。因此,他们试图禁止添加非架构属性。
或者,如果尝试将这些值保存到数据库中,则可能希望查看strict option(默认情况下为true)。