当前位置: 首页 > 知识库问答 >
问题:

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

邰勇军
2023-03-14

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

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

共有2个答案

陆宏扬
2023-03-14

Mongoose实际上可以使用为您进行到对象的转换。精益()选项。这比查询后的手动转换(如willis所述)更可取,因为它通过跳过原始Mongo文档从DB到mongoose对象的所有转换来优化mongoose查询,将文档保留为普通Javascript对象。因此,您的查询将类似于以下内容:

Cat.findOne({age:2}).lean().then(
    cat=>{
        cat.breed="puppy";    
        console.log(cat)
    }
)

结果将是相同的,只是这将跳过Mongoose文档到对象转换中间件。但是,请注意,当您使用时。lean()您将丢失所有Mongoose文档类方法,如。save()。remove(),因此,如果您需要在查询后使用其中任何一个,则需要遵循willis的答案。

彭鸿哲
2023-03-14

除了使用JSON. parse和JSON. stringify,您还可以调用toObject来将cat转换为常规的javascript对象。

Mongoose对象具有类似于保存set的方法,允许您轻松地修改和更新数据库中相应的文档。因此,他们试图禁止添加非模式属性。

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

 类似资料:
  • 我正在从Mongoose查询返回一个文档对象数组。数组中填充了预期的结果。 我试图添加一个新的属性到某些对象,只有在满足一个标准。我已经测试了这个元素,条件逻辑也按预期执行。我在上面的数组和另一个更大的数组中循环查找匹配的id。当找到匹配时,我需要添加一个属性,例如: 指向由fint()查询返回的数组中的对象。所以我应该以: 问题是,无论我尝试什么,都无法将新属性添加到数组中的特定对象上。 我在这

  • 问题内容: 一般而言,我对Mongoose和MongoDB还是很陌生,所以我很难确定是否可以进行以下操作: 有更好的方法吗? 编辑 如有任何混淆,我们深表歉意。我想做的是获取所有包含有趣标签或政治标签的商品。 编辑 没有where子句的文档: 使用where子句,我得到一个空数组。 问题答案: 对于大于3.2的现代MongoDB,您可以在大多数情况下用作替代。这也有实际上做加盟,而不是什么“在服务

  • 我正在尝试在javascript中设置对象键的类型。var obj={};obj。名称=字符串;obj。年龄=人数;obj。批准=错误;这更像是设计猫鼬模式。如。 以便在保存对象的同时检查猫鼬的类型。我怎么能执行这个功能与正常的javascript对象,同时声明它。我希望你们都理解我想要实现的目标。

  • 问题内容: 我在node.js上运行此代码 1)第一个console.log返回完整文档 2)第二个console.log返回未定义 我不明白为什么。 我需要执行类似 我该如何实现?我想念什么? 问题答案: 我怀疑您要获取的值不在您的中,而是存储在数据库中。 您有两种解决方案。您可以将其添加到您的文档中,然后Mongo可以将其绑定到您收到的对象。这是推荐的方法。 或者,您可以绕过猫鼬,并使用访问存

  • 问题内容: 我有这个电话: 我在哪里指定要返回的属性?在文档中找不到它。以上返回整个对象。我只希望返回一些属性。 这是我的架构: 我不想在我的休息电话中包含项目数组。 问题答案: 您使用投影。猫鼬查询文档中的第一个示例具有投影操作。 注意:不是真正的代码b / c,我用三颗星突出显示了重要的部分 该方案没有规定,但我认为例子是再清楚不过。

  • 问题内容: 我在用猫鼬填充后无法通过在文档内部匹配的值来查询文档。 我的架构是这样的: 我想让所有用户拥有例如类型为“ Gmail”的电子邮件。 以下查询返回空结果: 我不得不像这样过滤JS中的结果: 有没有办法从猫鼬直接查询类似的东西? 问题答案: @Jason Cust 已经很好地解释了它- 在这种情况下,通常最好的解决方案是更改架构,以防止通过存储在单独集合中的文档的属性进行查询。 不过,这