【问题标题】:Mongoose: Set default value in a required field when this is not present in the document to saveMongoose:当要保存的文档中不存在时,在必填字段中设置默认值
【发布时间】: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 字符串。

标签: node.js mongodb mongoose


【解决方案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 将创建一个新文档(如果尚不存在)。
猜你喜欢
  • 2014-09-13
  • 1970-01-01
  • 1970-01-01
  • 2020-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-28
  • 1970-01-01
相关资源
最近更新 更多