Mongoose:当要保存的文档中不存在时,在必填字段中设置默认值

Posted

技术标签:

【中文标题】Mongoose:当要保存的文档中不存在时,在必填字段中设置默认值【英文标题】:Mongoose: Set default value in a required field when this is not present in the document to save 【发布时间】:2017-07-11 11:52:40 【问题描述】:

我尝试在空白字段中设置默认值,以便将文档保存在 MongoDB 中

就我而言,这是猫鼬模式

var Distribution = new Schema(
    temporalCoverage: 
        startDate: type: Date, default: Date.now,
        endDate: type: Date, default: Date.now
    ,
    distributionText: String
);

这是要保存的文档:

"distribution": 
    "temporalCoverage": 
      "endDate": "",
      "startDate": ""
    ,
    "distributionText": "test"
  

在本文档中,空白字段为 endDate 和 startDate。该文档以空值保存在 mongoDB 中。

"distribution": 
    "temporalCoverage": 
      "endDate": null,
      "startDate": null
    ,
    "distributionText": "test"
  

我要保存默认值,不为空

如果将所需的字段放入架构中,temporalCoverage : startDate : type: Date, required: true, default: Date.now , endDate : type: Date, required: true, default: Date.now 我得到错误验证,并且文档没有保存它。

【问题讨论】:

更新时尽量不要提供这些密钥。不要将它们设置为 wmpty 字符串。 【参考方案1】:

您需要setDefaultsOnInsert 选项

var schema = new Schema(
  title: String,
  genre: type: String, default: 'Action'
);

var Movie = db.model('Movie', schema);

var query = ;
var update = title: 'The Terminator';
var options = 
  // Create a document if one isn't found. Required
  // for `setDefaultsOnInsert`
  upsert: true,
  setDefaultsOnInsert: true
;

Movie.
  findOneAndUpdate(query, update, options, function (error, doc) 
    assert.ifError(error);
    assert.equal(doc.title, 'The Terminator');
    assert.equal(doc.genre, 'Action');
  );

见http://mongoosejs.com/docs/defaults.html

【讨论】:

new 选项不是 Mongoose update() 操作的有效选项,因此不需要。将 upsert选项设置为 true 足以保证 Mongoose 将创建一个新文档(如果尚不存在)。

以上是关于Mongoose:当要保存的文档中不存在时,在必填字段中设置默认值的主要内容,如果未能解决你的问题,请参考以下文章

Mongodb 文档中不存在的字段出现在 mongoose findById() 结果中

具有必填子文档字段的 Mongoose 架构

如何防止 JAWS 在必填字段上说“无效条目”?

Mongoose findOneAndUpdate() 仅在文档​​已存在时更新,如果不存在则不创建新文档?

如何在保存在 Mongoose 之前检查数据库中是不是存在嵌入式文档

Mongoose - 在保存文档之前为每个对象生成 ObjectID