node.js - 在 mongoose 中,根据 findOneAndUpdate 中另一个字段的值设置一个字段
问题描述
我正在做一个项目,在一个模型中,我需要根据另一个字段值设置字段的值。让我用一些代码解释一下。
Destination model
const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const DestinationSchema = new Schema({
name: {
type: String,
required: true
},
priority: {
type: Number,
default: 0,
max: 10,
required: true
}
})
DestinationSchema.statics.getPriority = function(value) {
return this.findOne({ _id: value })
}
const Destination = mongoose.model('Destination', DestinationSchema)
exports.Destination = Destination
Task model
const mongoose = require('mongoose')
const { Destination } = require('../_models/destination.model')
const Schema = mongoose.Schema;
const TaskSchema = new Schema({
priority: {
type: Number,
required: true,
min: 0,
max: 25
},
from: {
type: Schema.Types.ObjectId,
ref: 'Destination',
required: true
},
to: {
type: Schema.Types.ObjectId,
ref: 'Destination',
required: true
},
type: {
type: Number,
required: true,
min: 0,
max: 3
}
}, {
timestamps: true
})
TaskSchema.pre('save', async function () {
this.priority = await Destination.getPriority(this.from).then(doc => {
return doc.priority
})
this.priority += await Destination.getPriority(this.to).then(doc => {
return doc.priority
})
this.priority += this.type
})
Task Controller update function
exports.update = async function (req, res) {
try {
await Task.findOneAndUpdate({
_id: req.task._id
}, { $set: req.body }, {
new: true,
context: 'query'
})
.then(task =>
sendSuccess(res, 201, 'Task updated.')({
task
}),
throwError(500, 'sequelize error')
)
} catch (e) {
sendError(res)(e)
}
}
当我创建一个新任务时,在预保存挂钩中设置了优先级,正如预期的那样。Task.from
但是当我需要更改或更改Task.to
为另一个时,我会碰壁destination
,然后我需要再次重新计算任务优先级。我可以在客户端执行此操作,但这会导致一个问题,即可以简单地将priority
更新查询发送到服务器。
我的问题是,当 a 更新为andTask
的新值时,如何计算它的优先级?我是否必须查询即将更新的文档以获取对它的引用,或者是否有另一种更清洁的方法可以做到这一点,因为这会导致对数据库的额外命中,我正在努力避免它越多越好。from
to
解决方案
推荐阅读
- html - 以下两个代码的优缺点
- windows - 是否可以使用 CFSTR_FILEDESCRIPTOR 拖放创建文件夹?
- spring-integration - 春季集成:无法与动物园管理员进行领导者选举
- gitlab - .gitlab-ci 阶段执行顺序
- android - 如何在 React Native 中重新导入 java 模块
- mysql - 如何对处于“全行”模式 SQL 的数据进行分组和重新排列
- c - 需要帮助纠正我的斐波那契数列代码
- javascript - 在类项目上注册事件并在单击时获取其属性
- spring-boot - 在 pubsub/spring-cloud-gcp-pubsub 中为订阅者重试设置
- python - 是否可以用 Python 做一个猜谜游戏,每个输入将在哪里接收随机数,比如动态循环输入?