node.js - 如何只更新一次 MongoDB 文档字段?

标签 node.js mongodb mongoose

我试图让 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/

相关文章:

Node.js - 在注册时发送电子邮件

mysql - errno : 1251, sqlMessage: '客户端不支持服务器请求的认证协议(protocol);考虑升级 MySQL 客户端

javascript - 如何在保存之前等待创建流的循环完成?

javascript - 如何验证 mongoose 和 node.js 上的 db.collections.insertOne 输入

node.js - Nodejs Lamba,如何异步执行 block 的某些部分并尽早返回api回调?

node.js - 如何使用绑定(bind)更新 Azure 函数中的 Azure 表行?

mongodb - Mongo Aggregation 删除一个 id 的所有记录,只保留最旧的记录

javascript - Mongoose 是否可以至少拥有一项所需的属性?

node.js - Mongoose:从现有数据生成模式

Mongodb 与 future 文档的聚合