【问题标题】:How to update a MongoDB document field only once?如何只更新一次 MongoDB 文档字段?
【发布时间】:2023-03-15 04:03:01
【问题描述】:

您好,如果文档中的字段尚未更新,我正在尝试只运行一次猫鼬查询,但我对$exist$update、@ 有点迷失了987654323@真的不知道用什么。

我有以下问题


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 一次,但随后的每个调用都应该让我返回相同的模型文档

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    我认为您需要的是 $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)
          })
      })
    }
    
    

    【讨论】:

      【解决方案2】:

      以简洁的异步形式编写它。它会起作用的。

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

      【讨论】:

        猜你喜欢
        • 2017-05-28
        • 1970-01-01
        • 2019-02-09
        • 2020-06-29
        • 1970-01-01
        • 2012-02-20
        • 2014-06-01
        • 1970-01-01
        相关资源
        最近更新 更多