gpt4 book ai didi

javascript - 编写一个更新/保存的 Mongoose 方法?

转载 作者:行者123 更新时间:2023-11-30 20:06:26 25 4
gpt4 key购买 nike

在我的订单文档中,我有一个当前的 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 方法来就地更新变量,而无需重新分配内容?

最佳答案

在您的 changeStatus 方法中,您已经拥有作为 this 调用的 Order 文档,因此您应该更新它而不是调用 findById 以便更改反射(reflect)在调用文档中。

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

关于javascript - 编写一个更新/保存的 Mongoose 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52893415/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com