Node.js 使用Mongoose混合架构选择集合属性时出现问题

Node.js 使用Mongoose混合架构选择集合属性时出现问题,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我正在从事一个项目,该项目涉及从外部源创建页面。由于这些外部源本质上是可变的,所以我不能严格定义要使用的模式。因此,我做了一些研究,了解了猫鼬,并创建了以下模型: var PageTemplate = new mongoose.Schema( { }, { strict: false } ); 在导入过程中,我执行upsert操作以更新现有条目并插入新条目: PageTemplate .findOneAndUpdate(

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

var PageTemplate = new mongoose.Schema(
    {
    },
    {
        strict: false
    }
);
在导入过程中,我执行upsert操作以更新现有条目并插入新条目:

PageTemplate
    .findOneAndUpdate(
        {
            slug: page.slug
        },
        page,
        {
            upsert: true
        }
    );
到目前为止,一切都很顺利。当我稍后尝试获取条目时,问题就出现了。当我
console.log
整个对象时,我得到了我所期望的——整个对象。出于某种原因,当我访问单个属性时,会得到未定义的

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对象等价物,以便访问所有自由格式的模式字段


另外,为了解开一些谜团,当您在
控制台.log
记录mongoose文档时,会调用
.toString()
方法,该方法实际上是输出原始格式。

页面模板.findOne
返回的对象是mongoose文档,这将只公开您在架构中定义的字段

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


另外,为了解开一些谜团,当您在
控制台.log
记录mongoose文档时,会调用
.toString()
方法,该方法实际上是输出原始格式。

页面模板.findOne
返回的对象是mongoose文档,这将只公开您在架构中定义的字段

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


另外,为了解开一些谜团,当您在
控制台.log
记录mongoose文档时,会调用
.toString()
方法,该方法实际上是输出原始格式。

页面模板.findOne
返回的对象是mongoose文档,这将只公开您在架构中定义的字段

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

另外,为了解开一些谜团,当您在
console.log
记录mongoose文档时,将调用
.toString()
方法,该方法实际上是输出原始格式。

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

据我验证,Mongoose似乎也能很好地处理混合类型字段。

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

据我验证,Mongoose似乎也能很好地处理混合类型字段。

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

据我验证,Mongoose似乎也能很好地处理混合类型字段。

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



据我验证,Mongoose似乎也能很好地处理混合类型字段。

console.log(page)
正在打印的内容?@AndrewLavers:{u id:553be4a36cdbaaf64690187a,slug:'page slug'}好的,如果您
console.log(page.toObject())
,那么结果会是一样的
typeof
还返回
object
。很好!那么,console.log(page.toObject().slug)呢?:)
console.log(page)
正在打印什么?@AndrewLavers:{u id:553be4a36cdbaaf64690187a,slug:'page slug'}好的,如果您
console.log(page.toObject())
,结果是一样的
typeof
还返回
object
。很好!那么,console.log(page.toObject().slug)呢?:)
console.log(page)
正在打印什么?@AndrewLavers:{u id:553be4a36cdbaaf64690187a,slug:'page slug'}好的,如果您
console.log(page.toObject())
,结果是一样的
typeof
还返回
object
。很好!那么,console.log(page.toObject().slug)呢?:)
console.log(page)
正在打印什么?@AndrewLavers:{u id:553be4a36cdbaaf64690187a,slug:'page slug'}好的,如果您
console.log(page.toObject())
,结果是一样的
typeof
还返回
object
。很好!那么,console.log(page.toObject().slug)呢?:)这是一个极好的解决方案。然而,Andrew的回答为我的场景提供了一个更健壮的解决方案。非常感谢您抽出时间提供答案。这是一个极好的解决方案。然而,Andrew的回答为我的场景提供了一个更健壮的解决方案。非常感谢您抽出时间提供答案。这是一个极好的解决方案。然而,Andrew的回答为我的场景提供了一个更健壮的解决方案。我非常感谢您抽出时间提供答案。这