findOneAndUpdate不会更新对象-猫鼬

时间:2018-10-30 17:41:03

标签: mongodb mongoose

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

我正在使用猫鼬,并尝试在异步函数中使用findOneAndUpdate来做到这一点:

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

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

我在做什么错了?

3 个答案:

答案 0 :(得分:0)

您没有执行查询。 尝试

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

还有一件事,您需要将await调用包装在异步函数中。

答案 1 :(得分:0)

之前:

{ "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下的旧数据。没关系 写。

希望这可能对您有帮助!

答案 2 :(得分:0)

您有2个问题:
首先使用没有异步的await函数,根据DOCS,没有异步就不能使用await:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await
第二:从findOneAndUpdate返回的输出将不会保证,将是已更新的数据,并且等待只能处理保证。