首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >查询后在mongoose对象中设置属性

查询后在mongoose对象中设置属性
EN

Stack Overflow用户
提问于 2019-03-03 16:18:24
回答 2查看 2.4K关注 0票数 0

在开发API时,我通常需要在mongoDb查询结果中设置额外的属性。但我做得不好。例如

模型

代码语言:javascript
复制
const Cat = mongoose.model('Cat', { name: String,age:Number });

查询

代码语言:javascript
复制
Cat.findOne({age:2})  .then(
    cat=>{
        cat.breed="puppy";    
        console.log(cat)
    } )

在这里,在我从mongoDb获得结果之后,我想将的属性设置为结果,但是我不能这样做,因为该属性没有在模式中定义

因此,为了设置额外的属性,我使用了一个hack

代码语言:javascript
复制
cat = JSON.parse(JSON.stringify(cat));
cat.favFood = "Milk"

我不认为这是编码的好方法。请给出更好的设置属性的方法,并解释黑客是如何工作的。

EN

回答 2

Stack Overflow用户

发布于 2019-03-03 16:59:06

猫鼬实际上可以使用toObject选项为您执行转换.lean()。这比查询后的手动转换(正如威利斯提到的那样)更可取,因为通过跳过从DB到mongoose对象的原始Mongo文档的所有转换,从而优化了猫鼬查询,从而使文档成为一个普通的Javascript对象。因此,您的查询将类似于以下内容:

代码语言:javascript
复制
Cat.findOne({age:2}).lean().then(
    cat=>{
        cat.breed="puppy";    
        console.log(cat)
    }
)

结果将是相同的,但这将跳过蒙鹅文档到对象转换中间件。但是,请注意,当您使用.lean()时,丢失了像.save().remove()这样的Mongoose文档类方法(),因此,如果您需要在查询后使用其中的任何方法,则需要遵循威利斯答案。

票数 4
EN

Stack Overflow用户

发布于 2019-03-03 16:26:05

与使用JSON.parseJSON.stringify不同,您可以调用toObjectcat转换为常规的javascript对象。

猫鼬对象上有saveset等方法,可以轻松地修改和更新数据库中的相应文档。因此,他们试图不允许添加非模式属性。

或者,如果您试图将这些值保存到数据库中,则可能希望查看严格选择 (默认情况下为真)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54970920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档