【问题标题】:Mongoose .update() does nothingMongoose .update() 什么都不做
【发布时间】:2020-06-08 18:09:36
【问题描述】:

我正在查找一个名为 Filter (myFilter=Filter.findById(id)) 的文档。我更新了一些字段,然后尝试使用 myFilter.update() 进行更新。 什么都没发生。 什么是有效的

myFilter.New=false; 
myFilter.save()

这很好,但会随机导致竞态条件。我是不是更新错了。

这是我的实现:

    let myFilter = await Filter.findById(myUser.filterID);

    if (!_.isUndefined(distance)) {
      myFilter.searchParams.distance = distance;
    }

    if (!_.isUndefined(distanceMetric)) {
      myFilter.searchParams.distanceMetric = distanceMetric;
    }

    await myFilter.update();

【问题讨论】:

  • 你的更新声明到底是什么?
  • 我会用它更新问题。 @AliElkhateeb
  • 我想你打算打电话给.save()

标签: mongodb mongoose mongodb-query mongoose-schema


【解决方案1】:

基于Mongoose DocsModel.update() 应该有两个参数(filterdoc)。

但是,在您的情况下,我建议您直接使用myFilter.save() 它应该可以工作,而无需设置myFilter.New=false

【讨论】:

  • 问题是竞争条件。当我们保存版本时会发生变化,导致“No matching document”错误。
【解决方案2】:

您没有正确使用 .update() 。您需要提供 _id 或文档的其他索引作为查询,然后提供要更新的数据。 .save() 将是去这里的方式。 你可以在这里查看更新https://docs.mongodb.com/manual/reference/method/db.collection.update/

【讨论】:

  • 问题是竞争条件。当我们保存版本时会发生变化,导致“No matching document”错误。
【解决方案3】:

我找到了另一个类似的问题。似乎要走的路是使用 findOneandUpdate :/

但我只想像上面那样有条件地设置某些字段。如果这不是要走的路,请告诉我。

这对我有用:

    await Filter.findByIdAndUpdate(myUser.filterID, {
      $set: {
        searchParams: {
          ...myFilter.searchParams
        }
      }
    });

【讨论】:

    【解决方案4】:

    试试这个查询

    let searchParams={}
    
     if (!_.isUndefined(distance)) {
      searchParams.distance = distance;
    }
    
    if (!_.isUndefined(distanceMetric)) {
      searchParams.distanceMetric = distanceMetric;
    }
    
    await Filter.update({_id: myUser.filterID},{$set:{searchParams}}
    

    【讨论】:

      【解决方案5】:

      要在使用findOne()findById() 加载文档后保存对文档所做的更改,请使用save()。例如:

      const myFilter = await Filter.findById(myUser.filterID);
      
      if (!_.isUndefined(distance)) {
        myFilter.searchParams.distance = distance;
      }
      
      if (!_.isUndefined(distanceMetric)) {
        myFilter.searchParams.distanceMetric = distanceMetric;
      }
      
      await myFilter.save();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-05-17
        • 2016-05-27
        • 1970-01-01
        • 2017-10-05
        • 1970-01-01
        • 2018-10-16
        • 2016-02-17
        • 2019-03-08
        相关资源
        最近更新 更多