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 模式中定义非必填字段?

未找到结果时如何从 Mongoose Find 查询返回自定义消息而不是空数组

当没有要指定的确切值“未定义”或“空”时,为 TypeScript 可选参数传递啥? [复制]