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

时间:2015-04-25 20:32:17

标签: node.js mongodb mongoose

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

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

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

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
    }
);

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

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

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

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