【问题标题】:I would like to update MongoDb document我想更新 MongoDb 文档
【发布时间】:2019-09-10 23:15:24
【问题描述】:

我的问题是更新文档的特定字段。 假设我们有多个输入字段,当我只是更改文档的一个字段时,其余字段将为空,因为我只是更新其中一个。有什么简单的方法可以更新一个字段而其余字段不变。

我可以给出一个 switch case 或 if-else 但我不认为这是一个 解决此类问题的适当方法。

updateChr:async ( args: any) => {
      try {

       const data = await Client.findByIdAndUpdate(args.clientId, 
        {$set:
        {
          chronology:{
            status: args.clientInput.status,
            note:args.clientInput.note,
            date: args.clientInput.date,
            file:{
              filename:args.clientInput.file.filename,
              data:args.clientInput.file.data,
              type:args.clientInput.file.type,
              size:args.clientInput.file.size,
            }
            }
        },
      }
      ,{useFindAndModify: false})
       return transformClient(data);
      } catch (err) {
        throw err;
      }
    },

【问题讨论】:

    标签: javascript node.js reactjs mongodb mongoose


    【解决方案1】:

    所以这里这部分是你需要注意的:

    {$set:
            {
              chronology:{
                status: args.clientInput.status,
                note:args.clientInput.note,
                date: args.clientInput.date,
                file:{
                  filename:args.clientInput.file.filename,
                  data:args.clientInput.file.data,
                  type:args.clientInput.file.type,
                  size:args.clientInput.file.size,
                }
                }
            },
          }
    

    您告诉 mongo 的是,无论现在这些字段中有什么(或者即使它们当前不存在),都将它们的新值设置为您提供的值。如果您提供一个空值,那么它会将其新值设置为空。如果您不想在新值为 null 的情况下更新它们,那么您需要在将数据推送到 mongo 之前清理数据。最简单的方法是在将数据添加到上面引用的对象之前对其进行清理。一旦你只得到了实际存在的数据,那么只需循环数据以为 mongo 创建更新对象,而不是像这里一样静态设置它。

    或者,如果这些字段中实际应该存在的数据在此阶段可用,您可以遍历空值并用 mongo 中的当前值或它们应该的任何值填充它们.

    【讨论】:

    • 是的,你是对的,你有这种情况的真实例子吗?我的意思是如何循环数据?而且不会浪费执行时间吗?对于每次更新数据都会一次又一次地存储旧值。
    • 对于状态、注释和日期,这很容易。只是一个简单的Object.entries(args.clientInput).forEach(([key,value])=>{if(value !== null){update[key]= value}}),其中 update 是一个预设的空对象。但是,对于“文件”,它是一个全有或全无的更新,因为它是一个子文档。如果您想以相同的方式更新文件中的每个条目,则必须提交第二个请求,其中您的更新参数匹配文件而不是文档的基础,因此它将是 {'chronology.file': $set: {...file}}
    • 至于执行时间,这样做可能会损失几个周期,但避免这种情况的唯一方法是将现有的 mongo 数据提供给更新函数,这样它就不必完全解析事物。它可以是this = new || original
    猜你喜欢
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2020-09-26
    • 2016-08-04
    • 2014-02-05
    相关资源
    最近更新 更多