如果文档中的字段还没有更新,我试图让Mongoose查询只运行一次,但是我对$exist
、$update
、$ne
有点困惑--我不知道该用什么。
我有以下疑问:
const assignPhotoCodeToModel = (modelID, photoCode) => {
const filter = { id: modelID }
const update = { photoCode: photoCode }
const options = { new: true, useFindAndModify: false }
return new Promise((resolve, reject) => {
ModelModel.findOneAndUpdate(filter, update, options)
.then((response) => {
resolve(response)
})
.catch((error) => {
reject(error)
})
})
}
但是我希望它只在Model.photoCode
字段为空的情况下运行,如果它已经有了值,我只希望它返回那个值。
我遇到的问题是,每次后端访问路由时,都会有一个新的photoCode被分配给模型,即使它已经被分配过了。
router.post(
'/payment/success',
(req, res, next) => {
...omitted_code...
photoCodeModel
.assignPhotoCodeToModel(req.body.modelId, photoCode)
... omitted_code
})
编辑1
我在尝试了这里提供的答案后写了这篇文章。乍一看,它们似乎是有效的,但现在我遇到了一个错误,即当Model.photoCode
中已经有一个值时,下面的函数将返回:
const assignPhotoCodeToModel = (modelID, photoCode) => {
//the difference is here
const filter = { id: modelID, photoCode : null }
const update = { $set: { photoCode: photoCode } }
const options = { new: true, useFindAndModify: false }
return new Promise((resolve, reject) => {
ModelModel.findOneAndUpdate(filter, update, options)
.then((response) => {
resolve(response)
})
.catch((error) => {
reject(error)
})
})
}
返回null
,而我实际上期望返回相同的模型文档。我猜是因为过滤的原因吧?当我删除photoCode : null
时,它又回到了“工作”状态,但随后我又回到了photoCode
字段被新值填充的问题。
基本上,我希望该函数只填充一次photoCode
文件,但每次后续调用都应该返回相同的模型文档。
2条答案
按热度按时间mutmk8jj1#
我认为您需要的是$set。而且,按照您的逻辑,我认为您必须查询“document that doesn't have photoCode yet”。它应该是:
2wnc66cl2#
用一个简洁的异步形式来写它。它会工作的。