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

时间:2021-04-06 08:49:45

标签: node.js mongodb mongoose

您好,如果文档内的字段尚未更新,我正在尝试使猫鼬查询仅运行一次,但我对 $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 一次,但每次后续调用都应该让我返回相同的模型文档

2 个答案:

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