gpt4 book ai didi

node.js - Mongoose 可选嵌套属性 - 检查空/未定义?

转载 作者:IT老高 更新时间:2023-10-28 13:30:32 25 4
gpt4 key购买 nike

我正在尝试在我的一个模型中添加一个“可选”嵌套文档。这是一个示例架构

var ThingSchema = mongoose.Schema({
name: String,
info: {
'date' : { type: Date },
'code' : { type: String },
'details' : { type: Object }
}
})
var Thing = mongoose.model('Thing', ThingSchema);

在这种情况下,我希望“info”属性可能为空(不是必需的),并且将具有检查信息是否为空/未定义的应用程序逻辑。

不幸的是,即使在 mongo 的文档中未定义 'info' 属性,mongoose 仍然会为我返回一个对象,用于检索到的模型中的 'info' 字段。

例如,当我运行此代码时,“信息”对象填充了一个(空)对象。

var thingOne = new Thing({
name: "First Thing"
})

thingOne.save(function(err, savedThing) {
if (savedThing.info) {
//This runs, even though the 'info' property
//of the document in mongo is undefined
console.log("Has info!");
}
else console.log("No info!");
})

我尝试如下定义 ThingSchema

var ThingSchema = mongoose.Schema({
name: String,
info: {
type: {
'date' : { type: Date },
'code' : { type: String },
'details' : { type: Object }
},
required: false

}
})

这允许我从数据库中检索未定义的“信息”属性,但这样做可以打破“信息”模式并添加随机属性,例如

savedThing.info.somePropertyThatDoesNotExistInTheSchema = "this shouldn't be here";

然后将被持久化到数据库中。此外,如果“info”属性包含任何进一步的嵌套文档,更新它们不会将 Thing 模型标记为脏,这意味着我必须手动将路径标记为已修改(通过 thing.markModified(path))

有什么方法可以完成我想做的事情吗?有没有这方面的最佳实践?我只是完全错误地使用了 Mongoose 模式吗?

我需要

  1. 检索事物架构的空“信息”属性
  2. 有一些方法可以测试 mongo 中的“info”属性是否实际上为 null,即使 mongoose 在检索时给它一个值。

最佳答案

Mongoose 会将任何返回的文档转换为用于定义模型的架构。

关于持久化到数据库的任意路径,您可以使用 strict抛出错误而不是静默删除它(默认情况下应该这样做)。

关于node.js - Mongoose 可选嵌套属性 - 检查空/未定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27851267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com