猫鼬->从自定义架构方法更新文档

时间:2019-05-16 12:04:56

标签: javascript mongodb mongoose methods schema

我想做的是从自定义架构函数中更新数组。

我有一个基于User的模型UserSchema

userschema.js

const UserSchema = mongoose.Schema( {
  firstName: String,
  lastName: String,
  schedule: {
    'type': Object,
    'default': {
      'mon': [],
      'tue': [],
      'wed': [],
      'thu': [],
      'fri': [],
      'sat': [],
      'son': []
    }
  }
} ) 

UserSchema.methods.saveTimeslot = async function( timeslot ) {

  const toSave = {
    'id': timeslot.id,
    'start': timeslot.start,
    'end': timeslot.end,
    'daily': timeslot.daily
  }

  this.schedule[ timeslot.day ].push( toSave )
  await this.save()
  return Promise.resolve()
}

const User = mongoose.model( 'User', UserSchema )

module.exports = User

在服务器上,我只调用了该函数:

server.js

// ------------
// Update user
// ------------
const user = await User.findOne( { '_id': decoded.id } )
await user.saveTimeslot( timeslot )
console.log('user saved: ', JSON.stringify( user, null, 2 ) )

该日志显示了按计划在正确阵列中的新时隙,但是当我再次运行该功能或在数据库中检查该时隙时,该时隙没有保存。

我想这样做而不是使用findOneAndUpdate,因为稍后我将根据this.schedule函数中的saveTimeslot进行更多操作。

我尝试了以下可行的方法:

userschema.js

const UserSchema = mongoose.Schema( {
  bla: Number
} ) 

UserSchema.methods.saveTimeslot = async function( timeslot ) {
  this.bla = Math.random()
  await this.save()
  return Promise.resolve()
}

const User = mongoose.model( 'User', UserSchema )

module.exports = User

有人知道如何解决这个问题吗?

任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

对于发现此问题的任何其他人,解决方案与嵌套的更新对象有关,因此默认情况下不会检测到更改。这种情况下的解决方案是调用

this.markModified('schedule')
await this.save()

应该将更改传播到数据库。该功能记录在此处https://mongoosejs.com/docs/schematypes.html#mixed