Mongodb findOneAndUpdate不';t更新对象-猫鼬

Mongodb findOneAndUpdate不';t更新对象-猫鼬,mongodb,mongoose,Mongodb,Mongoose,我正在尝试使用集合中的username属性查找该项,然后更新该项的picture\u url属性 我正在使用Mongoose,并尝试在异步函数中使用findOneAndUpdate来实现这一点: const username = 'myusername' const newPictureLink = 'picture.jpg' const updatedUser = await UserModel.findOneAndUpdate( { username }, { $set: { pic

我正在尝试使用集合中的
username
属性查找该项,然后更新该项的
picture\u 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)
但记录的值是现有项,不会更新。这不是日志记录问题,因为该项在数据库中也没有更改


我做错了什么?

您没有执行查询。 试一试


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

之前:

{ "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
  }
});
查询:

{ "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
  }
});
之后:

{ "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
  }
});
模式:

{ "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
  }
});

需要考虑的要点:

{ "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\u url
    键。你的字典里可能有拼写错误 查询中的架构或
  • 编写一个
    async
    函数来使用
    wait
  • 仔细检查
    用户名
    键。架构或查询中可能存在拼写错误
  • 无需编写
    .exec()
    函数,否则您将永远无法使用该函数 未调用函数时,
    updateUser
    下的旧数据。虽然还可以 写作
希望这可以帮助你

您有两个问题:
首先在没有异步的情况下使用wait函数,根据您不能在没有异步的情况下使用wait的文档:


第二:从findOneAndUpdate返回的输出将不会承诺,将是更新的数据,而Wait只能处理承诺。

之后会得到什么我已经在使用异步函数了。你所建议的改变似乎没有什么不同,我正在尝试。您是否故意删除了
$set
?你没提。关于
exec()
,我刚从文档中读到:“如果您需要一个完整的承诺,请使用.exec()函数”。既然我正在使用异步/等待,那么我不需要一个真正的承诺吗?FordNoand更新以这样的方式设计,它考虑FiLAST参数作为查询,第二个更新。因此,您不需要编写$set,如果使用$set,也可以。您正在使用async/await,因此我认为您不需要使用任何承诺。我输入的代码已经是异步函数的一部分,我应该更清楚地说明这一点。您对解决第二个问题有什么建议?是否用
.exec()
预先结束?