在我的订单文档中,我具有当前的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方法,而无需重新分配内容就可以在适当位置更新变量?
答案 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()
}