Mongoose可选的嵌套属性 - 检查null/undefined?

win*_*ith 6 mongoose mongodb node.js

我正试图在我的一个模型中有一个"可选的"嵌套文档.这是一个示例模式

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

在这种情况下,我希望"info"属性可能为null(不是必需的),并且将具有检查信息是否为null/undefined的应用程序逻辑.

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

例如,当我运行此代码时,'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!");
})
Run Code Online (Sandbox Code Playgroud)

我尝试像下面那样定义ThingSchema

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

  }
})
Run Code Online (Sandbox Code Playgroud)

这允许我从数据库中检索未定义的"info"属性,但这样做可以让我打破"info"架构并添加随机属性,如

savedThing.info.somePropertyThatDoesNotExistInTheSchema = "this shouldn't be here";
Run Code Online (Sandbox Code Playgroud)

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

有没有办法完成我想要做的事情?对此有什么最佳做法吗?我只是完全错误地使用mongoose模式吗?

我需要

  1. 检索Thing架构的null"info"属性
  2. 有一些方法来测试mongo中的"info"属性是否实际为null,即使mongoose在检索时给它一个值.

Jas*_*ust 0

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

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