Написать метод Mongoose, который обновляет / сохраняет? - PullRequest
0 голосов
/ 19 октября 2018

В моих документах заказа у меня есть текущее свойство status:

const StatusSchema = new Schema({
  code: {
    type: String,
    required: true,
    enum: ['pending', 'paid', 'failed'],
  },
  updatedAt: {
    type: Date,
    required: true,
    default: Date.now,
  },
})

Я также отслеживаю прошлых статусов в массиве.Итак, в моей фактической Order схеме у меня есть что-то вроде:

status: {
  type: StatusSchema,
},
statusHistory: [
  StatusSchema,
],

Теперь, когда я изменяю status.code ордера, я хочу, чтобы предыдущий статус был перенесен в statusHistory, не имеячтобы делать это вручную каждый раз.

Насколько я понимаю, метод будет наиболее подходящим способом сделать это.Итак, я написал:

OrderSchema.methods.changeStatus = async function (status) {
  const order = await this.model('Order').findById(this.id)
  order.statusHistory.push(this.status)
  order.status = {
    code: status,
  }
  return order.save()
}

Кажется, это работает.Однако, когда я использую его следующим образом:

const order = await Order.findById(id) // Has status "pending" here
await order.changeStatus('failed')
console.log(order.status) // Still pending, reference not updated

Моя исходная переменная order здесь не обновляется - в журнале консоли будет напечатан исходный порядок, извлеченный с помощью запроса findById, несмотря на то, что документбыл успешно обновлен и сохранен.

Как написать метод Mongoose, который будет обновлять переменную на месте, без необходимости переназначения?

1 Ответ

0 голосов
/ 19 октября 2018

В вашем методе changeStatus у вас уже есть документ Order, из которого он был вызван, доступным как this, поэтому вы должны обновить его вместо вызова findById, чтобы изменения отразились в вызывающем документе.

OrderSchema.methods.changeStatus = function (status) {
  const order = this
  order.statusHistory.push(this.status)
  order.status = {
    code: status,
  }
  return order.save()
}
...