【问题标题】:findOneAndUpdate doesn't update object - MongoosefindOneAndUpdate 不更新对象 - Mongoose
【发布时间】:2020-12-28 02:59:38
【问题描述】:

我正在尝试使用其username 属性在集合中查找一个项目,然后更新该项目的picture_url 属性。

我正在使用 Mongoose,并尝试在异步函数中使用 findOneAndUpdate 来执行此操作:

const username = 'myusername'
const newPictureLink = 'picture.jpg'
const updatedUser = await UserModel.findOneAndUpdate(
  { username },
  { $set: { picture_url: newPictureLink } },
  { new: true }
)
console.log(updatedUser)

但记录的值是现有项目,它没有更新。这不是日志记录问题,因为该项目在数据库中也没有更改。

我做错了什么?

【问题讨论】:

    标签: mongodb mongoose


    【解决方案1】:

    您没有执行查询。 试试

    const updatedUser = await UserModel.findOneAndUpdate(
      { username },
      { $set: { picture_url: newPictureLink } },
      { new: true }
    ).exec()
    

    还有一件事,你需要将 await 调用包装在 async 函数中。

    【讨论】:

    • 这之后你会得到什么
    • 我已经在使用异步函数了。您建议的更改似乎没有影响
    【解决方案2】:

    之前:

    { "username": "foo", "picture_url": "xyz.jpg"}
    

    查询:

    let username = "foo";
    
    async function findUpdate(){
      const updatedUser = await User.findOneAndUpdate(
          { username },
          { picture_url : "kkk.jpg" }, 
          {new: true});
    
        console.log("updatedUser: ", updatedUser);
    }
    
    findUpdate();
    

    之后:

    updatedUser:  { _id: 5bd89f55f255307d51f32572,
      username: 'foo',
      picture_url: 'kkk.jpg'}
    

    架构:

    let UserSchema = new Schema({
      username: {
        type: String
      },
      picture_url: {
        type: String
      }
    });
    

    需要考虑的要点:

    • 仔细检查picture_url 密钥。你可能有拼写错误 架构或查询中。
    • 编写async 函数以使用await
    • 仔细检查username 密钥。您可能在架构或查询中存在拼写错误。
    • 无需编写.exec() 函数,否则你将永远不会拥有 如果未调用函数,updatedUser 下的旧数据。虽然没关系 写。

    希望对你有帮助!!!

    【讨论】:

    • 干杯,我正在尝试这个。您是否故意删除了$set?你不提。关于exec(),我刚刚从文档中读到:“如果您需要一个成熟的承诺,请使用 .exec() 函数”。由于我使用的是异步/等待,我不需要真正的承诺吗?
    • FindOneAndUpdate 的设计方式是将 firat 参数视为查询,将第二个参数视为更新。所以你不需要写 $set 并且如果你使用 $set 也可以。您正在使用 async/await,所以我认为您不需要使用任何承诺。
    【解决方案3】:

    你有两个问题:
    首先使用没有异步的 await 函数,根据 DOCS 你不能在没有异步的情况下使用 await:
    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await
    第二:findOneAndUpdate返回的输出不会promise,是更新的数据,await只能处理promise。

    【讨论】:

    • 我输入的代码已经是异步函数的一部分,我应该更清楚地说明这一点。您对解决第二个问题有什么建议?前面加上.exec()?
    猜你喜欢
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 2016-09-13
    • 2017-05-06
    • 2022-11-01
    • 2017-12-21
    • 2022-10-13
    • 2020-07-11
    相关资源
    最近更新 更多