查询后在猫鼬对象中设置属性[重复]

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】:

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

Mongoose 对象具有saveset 等方法,可让您轻松修改和更新数据库中的相应文档。因此,他们试图禁止添加非模式属性。

或者,如果您尝试将这些值保存到数据库中,您可能希望查看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答案。

【讨论】:

以上是关于查询后在猫鼬对象中设置属性[重复]的主要内容,如果未能解决你的问题,请参考以下文章

当我需要用和子句分隔查询时,在猫鼬中有两个“或”子句[重复]

在猫鼬模式子文档中使用 async/await [重复]

按猫鼬中的引用属性过滤[重复]

在猫鼬中填充+聚合[重复]

如何在猫鼬中找到随机记录[重复]

Model.find() 在猫鼬中返回空 [重复]