查询后在猫鼬对象中设置属性

时间:2019-03-03 16:18:25

标签: javascript node.js mongodb object mongoose

在开发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"

我认为这不是编码的好方法。请提供一种更好的设置属性的方法,并说明该黑客是如何工作的。

2 个答案:

答案 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.stringifycat

猫鼬对象在其上具有诸如saveset之类的方法,使您可以轻松地修改和更新数据库中的相应文档。因此,他们试图禁止添加非架构属性。

或者,如果尝试将这些值保存到数据库中,则可能希望查看strict option(默认情况下为true)。

相关问题