Mongoose错误40试图更新createdAt字段

时间:2018-01-26 22:51:57

标签: node.js mongodb mongoose

我有以下型号

const assetSchema = new Mongoose.Schema({
  userID:         { type: ObjectId, required: true, ref: 'User' },
  status:         { type: String,   default: 'active' },
  title:          { type: String,   default: '' },
  description:    { type: String,   default: '' },
  images:         { type: Object,   default: [] },
  videos:         { type: Object,   default: [] },
  comments:       [ Message ],
},
{
  timestamps: true
})

当用户创建资产时,它将是仅包含objectId的草稿和其他具有默认值的字段。然后,用户将根据需要调用编辑服务,然后最终调用单独的服务来“发布”资产。

这是发布服务的相关代码:

asset.update({ status: 'active', createdAt: Date.now() }).exec()

这与mongodb 2.6一起使用,但是,在将数据库迁移到mongodb 3.6后,它会抛出以下错误:

{
  name: 'MongoError',
  message: 'Updating the path \'createdAt\' would create a conflict at \'createdAt\'',
  driver: true,
  index: 0,
  code: 40,
  errmsg: 'Updating the path \'createdAt\' would create a conflict at \'createdAt\''
}

我正在更新createdAt字段的原因是因为对于所有用例,资产的创建日期应该是用户发布它的日期,而不是用户创建草稿的日期

1 个答案:

答案 0 :(得分:0)

我建议在资产架构中定义自己的属性createdAt。

否则,您可以使用mongoose的mongoose-timestamp插件自动在文档中添加createdAt属性,然后在文档保存或更新时自动更新。

可在此处找到更多信息:  https://www.npmjs.com/package/mongoose-timestamp