我试图让 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
,但每次后续调用都应该只带回相同的模型文档。
最佳答案
我认为你需要的是 $set 。 而且,按照你的逻辑,我认为你必须查询“还没有 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)
})
})
}
关于node.js - 如何只更新一次 MongoDB 文档字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66965486/