Mongoose 可选嵌套属性 - 检查空/未定义?
Posted
技术标签:
【中文标题】Mongoose 可选嵌套属性 - 检查空/未定义?【英文标题】:Mongoose optional nested property - check for null/undefined? 【发布时间】:2015-03-07 05:24:30 【问题描述】:我正在尝试在我的一个模型中添加一个“可选”嵌套文档。这是一个示例架构
var ThingSchema = mongoose.Schema(
name: String,
info:
'date' : type: Date ,
'code' : type: String ,
'details' : type: Object
)
var Thing = mongoose.model('Thing', ThingSchema);
在这种情况下,我希望“info”属性可能为 null(不是必需的),并且将具有检查 info 是否为 null/未定义的应用程序逻辑。
不幸的是,即使在 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))
有什么方法可以完成我想做的事情吗?有没有这方面的最佳实践?我只是完全错误地使用了猫鼬模式吗?
我需要
-
检索事物架构的空“信息”属性
有一些方法可以测试 mongo 中的“info”属性是否实际上为 null,即使 mongoose 在检索时给它一个值。
【问题讨论】:
如果您使用您的第一个 Schema 并检查 hasOwnProperty 如果您的退货商品有“信息”,该怎么办?这并不意味着它返回 null 但至少您可以检查是否有更多信息。如果这不是一个选项,请告诉我更多您在哪里检查 null/undefined 以便我找到另一种方法。 【参考方案1】:Mongoose 会将任何返回的文档转换为用于定义模型的架构。
关于被持久化到数据库的任意路径,您可以使用strict
抛出错误而不是静默删除它(默认情况下应该这样做)。
【讨论】:
【参考方案2】:原生mongodb驱动中有连接选项ignoreUndefined
,可以解决这个问题。
https://mongodb.github.io/node-mongodb-native/2.1/reference/connecting/connection-settings/
【讨论】:
【参考方案3】:尝试使用
const Thing = mongoose.model('Thing', ThingSchema)
Thing.create( name: "First Thing" )
而不是
var thingOne = new Thing( name: "First Thing" )
thingOne.save(...)
这里是如何使用它
mongoosejs.com/...model_Model.create
【讨论】:
以上是关于Mongoose 可选嵌套属性 - 检查空/未定义?的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript,检查嵌套对象属性是不是为空/未定义的优雅方法[重复]
TypeError:无法解构“未定义”或“空”的属性“db”
Expressjs Mongoose 发现嵌套的嵌入文档未定义
如何使用嵌套的“类型”属性在 Mongoose 模式中定义非必填字段?