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的回答为我的场景提供了一个更健壮的解决方案。我非常感谢您抽出时间提供答案。这