Mongodb 文档中不存在的字段出现在 mongoose findById() 结果中
Posted
技术标签:
【中文标题】Mongodb 文档中不存在的字段出现在 mongoose findById() 结果中【英文标题】:Non-existing field in Mongodb document appears in mongoose findById() result 【发布时间】:2019-01-30 08:56:11 【问题描述】:我对 Mongoose 的相关知识有些陌生,我认为这种行为很奇怪。 Mongoose 返回的文档具有实际 MongoDb 文档中不存在的字段,并且似乎是 Mongoose 基于架构添加的。
我使用类似这样的模式(这个是简化的):
const ProfessionalSchema = new mongoose.Schema(
product:
details: [
_id: false,
id: String, // UUID
name: String,
prestations: [
_id: false,
id: String, // UUID
name: String,
price: Number,
],
],
,
[...]
使用 mongo CLI 实用程序在 Mongodb 中显示的我的文档没有产品字段。
我不明白的是为什么 Professional.findById().exec() 的结果返回一个带有 product:details[] 字段的文档。我希望在 Mongoose 返回的结果中没有该字段,因为它不存在于原始 MongoDb 文档中。 找到 https://mongoosejs.com/docs/guide.html(架构和模型段落)的 Mongoose 文档没有帮助。
我的业务逻辑将要求该字段不存在,而不是由架构强制。这可以实现吗?
【问题讨论】:
尝试查看default
选项。你可以例如默认您的product
为null
,然后在您的业务逻辑中处理“product
是null
”的情况,而不是“product
字段不存在”的情况。至于为什么会发生这种情况,那是因为您正在处理模式。如果文档中不存在该字段,它将被自动填充。架构的全部意义在于确保文档结构的一致性。
@B.Fleming,谢谢。我是 MongoDb 的新手,我必须承认,将 MongoDb 的无模式特性与面向模式的 Mongoose 相结合是非常令人困惑的。你的建议对我来说似乎很不错。发布此评论作为答案怎么样?
是的,同时处理这两个问题肯定会令人困惑。我不是 100% 确定这对你来说是否是一个足够的答案,所以我将它作为评论提交。我一定会提交正确的答案:)
【参考方案1】:
尝试查看default
选项。你可以例如默认您的产品为null
,然后在您的业务逻辑中处理“product
是null
”的情况,而不是“product
字段不存在”的情况。
至于为什么会发生这种情况,那是因为您正在处理架构。如果文档中不存在该字段,它将被自动填充。架构的全部意义在于确保文档结构的一致性。
【讨论】:
以上是关于Mongodb 文档中不存在的字段出现在 mongoose findById() 结果中的主要内容,如果未能解决你的问题,请参考以下文章
如果存在,如何更新文档,如果在 mongodb 中不存在,如何将其插入?