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

我试图在我的模型之一有一个“可选”嵌套文档。 这是一个示例模式

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

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

不幸的是,即使在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!"); }) 

我尝试像下面这样定义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模型标记为脏,这意味着我必须手动将path标记为已修改(通过thing.markModified(path))

有什么方法可以完成我想要做的事吗? 有没有最佳做法呢? 我只是完全不正确地使用mongoose模式?

我也需要

  1. 为Thing模式检索一个空的“info”属性
  2. 有一些方法可以testingmongo中的“info”属性是否实际为null,即使mongoose在检索时给它一个值。

Mongoose将把任何返回的文档转换成用于定义模型的模式。

关于任意path被持久化到数据库,你可以使用strict来抛出一个错误,而不是默默地放弃它(默认情况下应该这样做)。