写猫鼬的方法来更新/保存吗?

时间:2018-10-19 13:32:07

标签: javascript node.js mongodb mongoose mongoose-schema

在我的订单文档中,我具有当前的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 :(得分:1)

在您的changeStatus方法中,您已经有了Order可以调用的this文档,因此您应该更新该文档而不是调用findById,以便更改会反映在调用文档中。

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