使用 Mongoose 混合模式选择集合属性的问题

Issue selecting collection properties using Mongoose mixed schema

我正在从事一个涉及从外部源创建页面的项目。由于这些外部资源本质上是可变的,因此我无法严格定义要使用的模式。所以我做了一些研究并了解了 Mongoose 的 Mixed schema type 并创建了以下模型:

var PageTemplate = new mongoose.Schema(
    {
    },
    {
        strict: false
    }
);

在导入过程中,我执行了更新插入操作来更新现有条目并插入新条目:

PageTemplate
    .findOneAndUpdate(
        {
            slug: page.slug
        },
        page,
        {
            upsert: true
        }
    );

目前一切正常。当我稍后尝试获取条目时出现问题。当我 console.log 整个对象时,我得到了我所期望的——整个对象。出于某种原因,当我访问单个 属性 时,我得到 undefined.

PageTemplate.findOne(
    {
        slug: slug
    },
    function(err, page) {
        console.log(page); // Prints entire object
        console.log(page.slug); // Undefined
    }
)

我是不是误解了混合模式的行为方式?我需要执行提交操作吗?例如,对于一个简单的插入,我会这样做:

var page = new PageTemplate(data);
page.save();

非常感谢任何正确方向的推动。

注意:我的代码片段已被简化以演示我是如何设置我的项目的。如果需要更多上下文,请告诉我,我会更新我的问题。

编辑: 可能值得注意的是,这只是模式中未明确定义的属性的情况。如果我用显式定义的字段定义架构,我可以正确访问它们,但这似乎违背了混合类型架构的目的:

var PageTemplate = new mongoose.Schema(
    {
        slug: String
    },
    {
        strict: false
    }
);

您从 PageTemplate.findOne 取回的对象是一个 Mongoose 文档,它只会公开您在架构中定义的字段。

您可以调用 page.toObject() 将文档转换为其原始 javascript 等效对象,以便使您的所有自由格式架构字段都可访问。

此外,为了解决一些谜团,当您 console.loging mongoose 文档时,会调用 .toString() 方法,这实际上是输出原始格式。

您可以使用 page.get('slug').

据我验证,here, Mongoose getter 似乎也适用于混合类型字段。