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

标签 node.js mongodb mongoose

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

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/

相关文章:

javascript - 将 Mongoose 返回的数组转换为常规 JSON

node.js - 如何无条件地从MongoDB中的数组中提取所有元素

javascript - 得到一个未定义的 "Cannot read property ' myVar' ,即使使用 typeof 也无法解析

mongodb - $let 如何访问在其 mongoDB 表达式之外定义的变量?

javascript - AngularJS 数组未被 ng-repeat 识别

node.js - meteor 方法不起作用

mongodb - 使用nodejs在mongoDB中将字符串转换为聚合整数

node.js - 按逆序 Mongoose 排序

javascript - 如何在使用路径别名导入的文件上使用 Babel?

javascript - 如何在jade中渲染json对象并循环结果