您好,如果文档内的字段尚未更新,我正在尝试使猫鼬查询仅运行一次,但我对 $exist
、{{1 }}, $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)
})
})
}
为空时才运行此程序。如果它已经有一个值,我只希望它返回那个值。
我遇到的问题是,每次后端到达路由时,都会将新的 photoCode 分配给模型,即使它已经被分配。因此,它再次使用新的重新分配。
Model.photoCode
编辑:1:
好的,我是在尝试了此处提供的答案后写的。乍一看,它们似乎有效,但现在我遇到了一个错误,即当 router.post(
'/payment/success',
(req, res, next) => {
...omitted_code...
photoCodeModel
.assignPhotoCodeToModel(req.body.modelId, photoCode)
... omitted_code
})
中已经有一个值时,返回以下函数:
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
一次,但每次后续调用都应该让我返回相同的模型文档
答案 0 :(得分:2)
我认为您需要的是 $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)
})
})
}
答案 1 :(得分:1)
以简洁的异步形式编写它。它会起作用。
const assignPhotoCodeToModel = async (modelID, photoCode) => {
const filter = { id: modelID, photoCode : null };
const update = { photoCode: photoCode };
const options = { new: true, useFindAndModify: false };
return await ModelModel.findOneAndUpdate(filter, update, options);
}