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 选项。你可以例如默认您的productnull,然后在您的业务逻辑中处理“productnull”的情况,而不是“product 字段不存在”的情况。至于为什么会发生这种情况,那是因为您正在处理模式。如果文档中不存在该字段,它将被自动填充。架构的全部意义在于确保文档结构的一致性。 @B.Fleming,谢谢。我是 MongoDb 的新手,我必须承认,将 MongoDb 的无模式特性与面向模式的 Mongoose 相结合是非常令人困惑的。你的建议对我来说似乎很不错。发布此评论作为答案怎么样? 是的,同时处理这两个问题肯定会令人困惑。我不是 100% 确定这对你来说是否是一个足够的答案,所以我将它作为评论提交。我一定会提交正确的答案:) 【参考方案1】:

尝试查看default 选项。你可以例如默认您的产品为null,然后在您的业务逻辑中处理“productnull”的情况,而不是“product 字段不存在”的情况。

至于为什么会发生这种情况,那是因为您正在处理架构。如果文档中不存在该字段,它将被自动填充。架构的全部意义在于确保文档结构的一致性。

【讨论】:

以上是关于Mongodb 文档中不存在的字段出现在 mongoose findById() 结果中的主要内容,如果未能解决你的问题,请参考以下文章

猫鼬。删除模式中不存在的保存字段

如果存在,如何更新文档,如果在 mongodb 中不存在,如何将其插入?

如果 mongodb 中不存在,如何修改现有数据或创建新数据?

MongoDB学习总结 —— Windows平台下安装

MongoDB 覆盖索引查询

MongoDB:通过不存在的字段查找文档?