mongoose 如何只更新MongoDB文档字段一次?

llew8vvj  于 2022-11-13  发布在  Go
关注(0)|答案(2)|浏览(229)

如果文档中的字段还没有更新,我试图让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文件,但每次后续调用都应该返回相同的模型文档。

mutmk8jj

mutmk8jj1#

我认为您需要的是$set。而且,按照您的逻辑,我认为您必须查询“document that doesn't have photoCode yet”。它应该是:

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)
      })
  })
}
2wnc66cl

2wnc66cl2#

用一个简洁的异步形式来写它。它会工作的。

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);
}

相关问题