如何使用mongoose更新MongoDB中的模式数组?

jxct1oxe  于 2023-02-07  发布在  Go
关注(0)|答案(2)|浏览(159)

通常,我可以从MongoDB中查询一个项目,像修改其他对象一样修改它,然后调用保存方法将其保存到数据库中。但是,它对我的模式数组不起作用。我在这方面没有太多经验,所以请对我温柔一些。
以下是相关的模式:

const bracketClicksSchema = new mongoose.Schema({
  bracketID: String,
  duo1Click: Boolean,
  duo2Click: Boolean,
  duo3Click: Boolean,
  duo4Click: Boolean,
  duo5Click: Boolean,
  duo6Click: Boolean,
  duo7Click: Boolean
});

const userSchema = new mongoose.Schema({
  userId: String,
  brackets: [bracketClicksSchema]
});

以下是用户模型:

const User = mongoose.model('User', userSchema);

这就是我尝试创建一个新用户并填充bracketClicksSchema数组的方法。console.log()语句显示对象被正确地更改,但是再次从数据库调用它显示它实际上还没有保存到MongoDB。

app.post('/api/user', async (req, res) => {
  let user = await User.findOne({
    userId: req.body.id
  });
  
  if (user.brackets == null || user.brackets[0].bracketID != req.body.date1) {
    user = new User({
      userId: req.body.id,
      brackets: [
        {
          bracketID: req.body.date1,
          duo1Click: false,
          duo2Click: false,
          duo3Click: false,
          duo4Click: false,
          duo5Click: false,
          duo6Click: false,
          duo7Click: false
        },
        {
          bracketID: req.body.date2,
          duo1Click: false,
          duo2Click: false,
          duo3Click: false,
          duo4Click: false,
          duo5Click: false,
          duo6Click: false,
          duo7Click: false
        },
        {
          bracketID: req.body.date3,
          duo1Click: false,
          duo2Click: false,
          duo3Click: false,
          duo4Click: false,
          duo5Click: false,
          duo6Click: false,
          duo7Click: false
        },
      ]
    });
  }
  
  console.log("new user: " + user);
  try {
    await user.save();
    res.send(user);
  } catch (error) {
    console.log(error);
  }

  // Check if saved successfully
  user = await User.findOne({
    userId: req.body.id
  });
  console.log("finding user again: " + user);
});

控制台语句:

new user: {
  userId: '1234',
  brackets: [
    {
      bracketID: '2023-02-05',
      duo1Click: false,
      duo2Click: false,
      duo3Click: false,
      duo4Click: false,
      duo5Click: false,
      duo6Click: false,
      duo7Click: false,
      _id: new ObjectId("63e01fa1ae236745bf8ce09c")
    },
    {
      bracketID: '2023-02-04',
      duo1Click: false,
      duo2Click: false,
      duo3Click: false,
      duo4Click: false,
      duo5Click: false,
      duo6Click: false,
      duo7Click: false,
      _id: new ObjectId("63e01fa1ae236745bf8ce09d")
    },
    {
      bracketID: '2023-02-03',
      duo1Click: false,
      duo2Click: false,
      duo3Click: false,
      duo4Click: false,
      duo5Click: false,
      duo6Click: false,
      duo7Click: false,
      _id: new ObjectId("63e01fa1ae236745bf8ce09e")
    }
  ],
  _id: new ObjectId("63e01fa1ae236745bf8ce09b")
}
finding user again: {
  _id: new ObjectId("63b9b3da9e19eabef4d4987b"),
  userId: '1234',
  brackets: null,
  __v: 0
}

如何成功地将我创建的新用户对象保存到MongoDB?

pb3s4cty

pb3s4cty1#

你忘了populate('brackets')

// Check if saved successfully
user = await User.findOne({
  userId: req.body.id
}).populate('brackets');

console.log("finding user again: " + user);
w8ntj3qf

w8ntj3qf2#

您正在创建一个新用户,用户名与从前端传过来的userId相同,创建后,数据库中将存在多个用户名相同。
由于您使用的是findOne()查询,因此只返回第一个匹配的用户。
尝试改用find()查询,并检查新用户是否存在于您将返回的数组中。

相关问题